我一直在审查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;
}
a任务的一个示例是:
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();
答案 0 :(得分:1)
显然我在
之后缺少.ConfigureAwait(false)Task<List<SearchModel>> completedTask = await Task.WhenAny(taskList);
对此:
Task<List<SearchModel>> completedTask = await Task.WhenAny(taskList).ConfigureAwait(false);
@KevinGrosse谢谢!
虽然不确定为什么我需要它。在异步管道中运行时不需要。