c# - 如何在 C# 中等待多个异步任务?
问题描述
我有这个共享功能:
public static async Task<IList<T>> ExecuteQueryAsync<T>(this CloudTable table, TableQuery<T> query, System.Threading.CancellationToken ct = default(System.Threading.CancellationToken), Action<IList<T>> onProgress = null) where T : ITableEntity, new()
{
var items = new List<T>();
TableContinuationToken token = null;
do
{
TableQuerySegment<T> seg = await table.ExecuteQuerySegmentedAsync<T>(query, token);
token = seg.ContinuationToken;
items.AddRange(seg);
if (onProgress != null) onProgress(items);
} while (token != null && !ct.IsCancellationRequested);
return items;
}
我通常会这样调用这个函数
var query = new TableQuery<DynamicTableEntity>();
var res2 = await myTable.ExecuteQueryAsync(query);
这给了我 IList
我正在尝试同时执行两个查询,但我很困惑。
到目前为止我做了什么
List<Task> TaskList = new List<Task>();
Task task1 = Task.Factory.StartNew( () =>
{
return table1.ExecuteQueryAsync(query);
});
Task task2 = Task.Factory.StartNew( () =>
{
return table2.ExecuteQueryAsync(query2);
});
Task.WaitAll(task1, task2);
var res = ((Task<Task<IList<DynamicTableEntity>>>)task1).Result.Result ;
var res2 = ((Task<Task<IList<DynamicTableEntity>>>)task2).Result.Result ;
它运行良好,但我不确定这是否是正确的方法?
任何帮助将不胜感激
解决方案
你不想使用Task.Factory.StartNew
(也不需要更好Task.Run
),你不应该使用Task.WaitAll
异步代码。
相反,确保方法标记为async
,然后只启动任务,而不等待,然后使用 await 的结果Task.WhenAll
var task1 = table1.ExecuteQueryAsync(query);
var task2 = table2.ExecuteQueryAsync(query2);
await Task.WhenAll(task1, task2);
// Access the results of the completed Tasks here
推荐阅读
- r - 合并具有不同长度但具有相互列名的数据帧
- android - 如何通过 REST api 使用 SMS for Firebase 执行 2FA?
- node.js - 如何使用 JWT 防御会话攻击?
- html - 从作为 HTML 文档返回的 Http 响应中提取数据块
- sql - 如果字符串有特殊字符,那么如何使用子字符串函数
- html - div内的中心导航栏
- python-2.7 - 从表面坐标推导出流形的法向量
- c - [Aspell][C][Pipes] Child and Parent - 使用管道重定向 - Unix C
- java - 无法使用 Hibernate 连接到数据库
- javascript - 如何在wordpress中使用ajax在数据库中插入图像