Task。何时可以通过同步管道解决?

时间:2018-11-27 23:10:12

标签: c# async-await task-parallel-library

我一直在审查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();

1 个答案:

答案 0 :(得分:1)

显然我在

之后缺少.ConfigureAwait(false)
Task<List<SearchModel>> completedTask = await Task.WhenAny(taskList);

对此:

Task<List<SearchModel>> completedTask = await Task.WhenAny(taskList).ConfigureAwait(false);

@KevinGrosse谢谢!

虽然不确定为什么我需要它。在异步管道中运行时不需要。