C#学习教程:UOW-在上一个异步操作完成之前在此上下文中启动了第二个操作部分,一个是通过棱镜导航。当允许导航时,我会异步启动深度加载,但每次都有一个新的上下文。在后面的代码中,我想取消未完成此加载的挂起导航,但下面的代码甚至不起作用,所以取消是稍后的事情;-)导航逻辑:这里没有问题publicvoidOnNavigatedTo(NavigationContextnavigationContext){intrelatieId=(int)navigationContext.Parameters["RelatieId"];如果(_relatie!=null&&_relatie.RelatieId==relatieId)返回;loadRelatieAsync(relatieId);}publicvoidConfirmNavigationRequest(NavigationContextnavigationContext,ActioncontinuationCallback){boolnavigationAllowed=true;continuationCallback(允许导航);}深度加载逻辑:私有异步任务loadRelatieAsync(intrelatieId){_relatieTypeTypes=awaitgetRelatieTypeTypesAsync(_unitOfWork,relatieId).ConfigureAwait(true);_relatie=relations.FirstOrDefault();_unitOfWork.Dispose();}).ConfigureAwait(true);processRelatie(_relatie);processRelatieTypes(_relatie,_relatieTypeTypes);}catch(ExceptionEx){MessageBox.Show(Ex.Message);扔;}}privateasyncTaskgetRelatieAsync(IUnitOfWorkAsyncunitOfWork,intrelatieId){IEnumerablerelaties=null;尝试{IRepositoryAsyncrelatieRepository=unitOfWork.RepositoryAsync();relaties=awaitrelatieRepository.Query(r=>r.RelatieId==relatieId).Include(i=>i.BegrafenisOndernemer).SelectAsync().ConfigureAwait(false);IRepositoryAsyncadresRepository=unitOfWork.RepositoryAsync();//执行以下行后抛出异常varadressen=awaitadresRepository.Query(r=>r.RelatieId==relatieId).Include(i=>i.AdresType).SelectAsync().ConfigureAwait(false);_relatieTypeRepository=unitOfWork.RepositoryAsync();varrelatieTypes=await_relatieTypeRepository.Query(r=>r.RelatieId==relatieId).SelectAsync().ConfigureAwait(false);}catch(ExceptionEx){MessageBox.Show(Ex.Message);//异常此处显示onthrow;}返回关系;}privateasyncTaskgetRelatieTypeTypesAsync(IUnitOfWorkAsyncunitOfWork,intrelatieId){IEnumerablerelatieTypeTypes=null;尝试{IRepositoryAsyncrelatieTypeTypeRepository=unitOfWork.RepositoryAsync();relatieTypeTypes=awaitrelatieTypeTypeRepository.Query().SelectAsync().ConfigureAwait(false);}catch(ExceptionEx){MessageBox.Show(Ex.Message);扔;}返回relatieTypeTypes;当我想在GUI线程上继续时,我也正确地使用了configureawait(true)。但是我在深度加载逻辑中不断收到这个错误。工作单元和存储库类也使用异步等待机制,但我正在正确等待。在上一个异步操作完成之前在此上下文上启动第二个操作。使用“await”确保所有异步操作在调用此上下文的另一个方法之前已完成。没有实例成员保证是线程安全的。编辑(删除记录器代码以减少代码大小)问题是这段代码:_unitOfWork=_UnitOfWorkFactory.createUnitOfWorkAsync();IEnumerablerelations=awaitgetRelatieAsync(_unitOfWork,relatieId).ConfigureAwait(true);_relatieTypeTypes=awaitgetRelatieTypeTypesAsync(_unitOfWork,relatie).ConfigureAwait(true);_relatie=relations.FirstOrDefault();_unitOfWork.Dispose();UnitOfWork是场景第二次被新实例覆盖时的实例变量。已经执行的场景然后使用新的UnitOfWork而不是它自己的,因为它被覆盖了。不是那么容易发现,而是简单的竞争条件。我是通过把所有的实例变量都换成局部变量找到的,然后问题就失败了。这可能不是答案,而是代码的一般视图。async/await的主要目的是保持当前线程可用。这有助于阻止UI线程并保持您的应用程序响应。您已经确定深度加载发生在ThreadPool线程上,因为您完全使用Task.Run()启动它。您可以通过在加载机制中使用EntityFramework的默认同步方法来解决大多数问题。乍一看,您的代码看起来很适合异步调用。也许你的深度负载被多次触发?以上就是C#学习教程:UOW-在最后一个异步操作完成之前,在这个上下文中开始第二个操作,分享所有内容。如果对大家有用,需要进一步了解C#学习教程,还望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: