首页 > 解决方案 > 如何在 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 ;

它运行良好,但我不确定这是否是正确的方法?

任何帮助将不胜感激

标签: c#

解决方案


你不想使用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

推荐阅读