无法使异步方法正常工作:“连接已关闭”

我正在尝试异步删除不再需要的照片记录,但是我无法使这种方法正常工作。我不断遇到异常:

  

无效的操作。连接已关闭。

麻烦似乎出在foreach循环中……如果我仅对一张照片而不是对所有照片都这样做,那么它就可以了。例如,如果我发送此方法的照片数组恰好具有1个成员,则它可以工作。如果有两个,则失败。

但是,如果我复制部分代码来对数组的第一张照片和数组的第二张照片等进行硬编码处理,它将起作用。只是当我使用一个实际的循环时,它才会爆炸。真是的。

public async void DeletePhotosAsync(PhotoEntity[] photos)
{
    var deletingParentPhotos = new List<Task>();
    var deletingChildPhotos = new List<Task>();
    try
    {
        _siteAdapter.StartTransaction(System.Data.IsolationLevel.ReadCommitted,"Delete Photos");

        foreach (var photo in photos)
        {
            deletingChildPhotos.Add(Task.Run(() => _siteAdapter.DeleteEntityCollection(photo.Photo.ChildPhotos)));
        }

        await Task.WhenAll(deletingChildPhotos).ConfigureAwait(false);

        foreach (var photo in photos)
        {
            deletingParentPhotos.Add(Task.Run(() => _siteAdapter.DeleteEntity(photo.Photo)));
        }

        await Task.WhenAll(deletingParentPhotos).ConfigureAwait(false);

        _siteAdapter.Commit();
    }
    catch (Exception ex)
    {
        _siteAdapter.Rollback();
    }
}
at SD.LLBLGen.Pro.ORMSupportClasses.actionQuery.Execute()
   at SD.LLBLGen.Pro.ORMSupportClasses.DataaccessAdapterCore.ExecuteactionQuery(IactionQuery queryToExecute)
   at SD.LLBLGen.Pro.ORMSupportClasses.DataaccessAdapterCore.DeleteEntity(IEntity2 entityToDelete,IPredicateExpression deleteRestriction)
   at SD.LLBLGen.Pro.ORMSupportClasses.DataaccessAdapterBase.<>c__DisplayClass7_0.<DeleteEntity>b__0()
   at SD.LLBLGen.Pro.ORMSupportClasses.UnitOfWork2.HandleDeletes(IDataaccessAdapter adapterToUse)
   at SD.LLBLGen.Pro.ORMSupportClasses.UnitOfWork2.CommitImpl(IDataaccessAdapter adapterToUse,Boolean autoCommit)
   at SD.LLBLGen.Pro.ORMSupportClasses.DataaccessAdapterCore.DeleteEntityCollection(IEntityCollection2 collectionToDelete)
   at SD.LLBLGen.Pro.ORMSupportClasses.DataaccessAdapterBase.<>c__DisplayClass8_0.<DeleteEntityCollection>b__0()
   at Site.Models.PhotoModel.<>c__DisplayClass9_0.<DeleteInspectionPhotosAsync>b__0() in C:\Users\aletwor\source\repos\Site\Site.Models\PhotoModel.cs:line 158
   at System.Threading.Tasks.Task`1.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.Taskawaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskawaitable.ConfiguredTaskawaiter.GetResult()
   at Site.Models.PhotoModel.<DeleteInspectionPhotosAsync>d__9.MoveNext() in C:\Users\aletwor\source\repos\Site\Site.Models\PhotoModel.cs:line 174
lcq3822987 回答:无法使异步方法正常工作:“连接已关闭”

这里的问题是您正在使用Task.Run,它启动了您不等待的异步任务。这些任务可以在您提交/回滚_siteAdapter事务后 运行。

要正确执行此操作,您需要等待所有这些任务。取决于DeleteEntityDeleteEntityCollection实际在做什么,在后台线程上并行运行它们可能也没有任何好处。

本文链接:https://www.f2er.com/3098902.html

大家都在问