【发布时间】:2018-11-28 09:43:00
【问题描述】:
我一直在查看How to call asynchronous method from synchronous method in C#?,以便在非异步函数中解决异步调用。
我可以使用该文章的解决方案 A 来解决我的个人异步任务。但是当单个异步函数本身包含对异步调用数组的调用时,我看不到它是如何完成的。现在它只是在通话中冻结
var result = task.WaitAndUnwrapException();
这就是我所拥有的
public static async Task<List<SearchModel>> GoAsync(SearchContract search, CancellationToken cancellationToken = default(CancellationToken))
{
var taskList = new List<Task<List<SearchModel>>>
{
SearchRoutine1Async(search, cancellationToken),
SearchRoutine2Async(search, cancellationToken)
};
Task<List<SearchModel>> completedTask = await Task.WhenAny(taskList);
return completedTask.Result;
}
一个任务的例子是:
public static async Task<List<SearchModel>> SearchRoutine1Async(SearchContract search, CancellationToken cancellationToken = default(CancellationToken))
{
using (DBContext db = new DBContext)
{
var searchModels= await db.SearchModel
.Where(sm => sm.subKey1 = search.subKey1)
.ToListAsync(cancellationToken)
.ConfigureAwait(false)
;
return searchModels;
}
}
来自同步例程的调用如下,它在任务上冻结。WaitAndUnwrapException...:
var task = GoAsync(search);
var result = task.WaitAndUnwrapException();
回顾一下......如果我绕过 GoAsync 例程并单独调用任务......它可以从同步例程中执行此操作:
var task = SearchRoutine1Async(search);
var result = task.WaitAndUnwrapException();
【问题讨论】:
-
等待
Task.WhenAny时不要忘记.ConfigureAwait(false) -
@KevinGosse 我认为这确实有效。至少现在似乎是。添加到答案,我会接受。
标签: c# async-await task-parallel-library