【发布时间】:2018-09-22 22:41:27
【问题描述】:
如何等到前一个方法完成后再继续执行?我以为这很容易,但事实并非如此。尽管我已经阅读了很多示例,但我一定是在做一些非常愚蠢的事情。在下面的代码中,我不能让 GetDocVM() 方法执行,直到 AddUserDocuments() 方法完成。为什么?因为 GetDocVM() 不会拉入刚刚添加的记录。我继承了这段代码并正在努力改进它。
ut.ModelJSON = await Task.Run(() => _userTransactionService.ConvertToModelJson(typeof(UserDocument).Name, "", transactionDocs)).ConfigureAwait(false);
var taskReturnsVoid = Task.Run(() => _genericUploadService.AddUserDocuments(ut, docs));
List<GenericUploadDocumentViewModel> viewModel = new List<GenericUploadDocumentViewModel>();
await taskReturnsVoid.ContinueWith((t) =>
{
viewModel = GetDocVM();//I EXPECTED THIS TO WAIT TO BE EXECUTED
});
return Json(viewModel, JsonRequestBehavior.AllowGet); //GETTING HERE TOO SOON
【问题讨论】:
-
我想知道为什么您使用任务来运行不能同时运行的东西。你只是创造了很多开销而没有任何收获。
-
我似乎无法重现您所看到的,但为什么首先要
ContinueWith?只需在viewModel = GetDocVM之后await就可以满足您的需求。当你有async/await时,不需要ContinueWith。 -
ContinueWith是多余的。await taskReturnsVoid已经将该行之后的所有内容安排为任务完成后运行的延续。因此,通过将viewModel = GetDocVM()放在 await 之后,它就是已经安排好的延续的一部分。 -
@BigDaddy ContinueWith 工作得很好,但在这里是多余的。
await Task.Run也很浪费。为什么要启动 another 线程只是为了阻止当前线程?您最终会导致额外的延迟,而不是在后台运行任何东西。 Web 请求已经由单独的线程提供服务 -
@BigDaddy 为什么使用
ContinueWith而不是await taskReturnsVoid ;var viewModel = await Task.Run(()=>GetDocVM());?您是否遇到GetDocVM()的问题并认为ContinueWith会有所作为?
标签: c# asp.net-mvc async-await task-parallel-library