Удалите объект сервисного уровня из viewmodel wpf и c # - PullRequest
1 голос
/ 02 октября 2019

Я новичок в концепции IDisposable, у меня есть следующий сценарий с исключением (поток переполнения стека) при удалении объекта.

Мне нужно создать несколько запросов (параллельно), чтобы получитьответ от API.

Как показано ниже:

ViewModel

public vm 
{ 
    vm(IunityContainer container) { }

    public void somemethod 
    { 
        await ListofItems.ParallelForEachAsync(async item =>
        {
           try
           {
               using (var objectService = _container.Resolve<IobjectService>())
               {
                   var response = await objectService.GeAllItem(request);

                   concurrentBag.Add(response);
               }

           }
           catch (Exception e)
           {

               _logger.Error("Failed operation.", e);
           }

        },maxDegreeOfParallelism: 5);

    }
}

Service.cs

public class Service : Idisposable
{


    protected virtual void Dispose(bool disposing)
    {
        if (_disposed)
           return;

        if (disposing)
        {
           this.Dispose();// not sure how to dispose the service layer object which is created 
        }

        _disposed = true;
    }


    public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }


}

Проблема : так как я создаюнесколько объектов в параллельном потоке при завершении использования (}) выдает исключение stackoverflow.

решение: я хотел избавиться от «objectService», который создает каждую итерацию foreach.

Пожалуйста, помогите мне решить эту проблему.

1 Ответ

1 голос
/ 02 октября 2019

Ошибка переполнения стека возникает из-за того, что Dispose() вызывает Dispose(bool disposing), который снова вызывает Dispose() и так далее до тех пор, пока вы не достигнете конца стека.

Это не проблема многопоточности.

Если вы снова посмотрите на пример для IDisposable объекта, предоставленного Microsoft https://docs.microsoft.com/fr-fr/dotnet/api/system.idisposable?view=netframework-4.8, вы увидите, что внутри if (disposing) вам нужно вызвать Dispose для всех IDisposable членов, который содержится в классе, а не в самом классе (не this.Dispose () )

...