首页 > 解决方案 > Task.WhenAny 这可以从同步管道中解决吗?

问题描述

我一直在查看如何在 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;
            }
        }

来自同步例程的调用如下,它在 task.WaitAndUnwrapException 上冻结...:

var task = GoAsync(search);
var result = task.WaitAndUnwrapException();

回顾一下......如果我绕过GoAsync例程并单独调用任务..它可以从同步例程中执行此操作:

var task = SearchRoutine1Async(search);
var result = task.WaitAndUnwrapException();

标签: c#async-awaittask-parallel-library

解决方案


显然我在 .ConfigureAwait(false) 之后

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

对此:

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

@KevinGrosse 谢谢!

不知道为什么我需要它。在异步管道中运行时不需要。


推荐阅读