c# - 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();
解决方案
显然我在 .ConfigureAwait(false) 之后
Task<List<SearchModel>> completedTask = await Task.WhenAny(taskList);
对此:
Task<List<SearchModel>> completedTask = await Task.WhenAny(taskList).ConfigureAwait(false);
@KevinGrosse 谢谢!
不知道为什么我需要它。在异步管道中运行时不需要。
推荐阅读
- c# - 如何编码音频文件并统一保存?
- python - 当页面向下滚动时元素可用时如何获取动态页面上的元素?
- r - 在管道工 api 中使用 sf 包——sf::st_as_sf 似乎失败了
- jquery - JQuery 升级导致 dom 属性获取和设置缓慢
- python - pip 在我的 python 虚拟环境中失败
- flutter - 有没有办法改变.operator“字符串”的条件
- java - Java中的不忠将Unicode字符写入xls文件
- javascript - 在 for await 中继续之前等待 asyncronus 事件
- android - 如何使用 Kotlin isNullOrEMpty() 让它变得更好
- python - 通过 sqlalchemy 构建表的麻烦