【发布时间】:2015-12-13 13:57:35
【问题描述】:
是否可以使用 async await 语法重写下面的代码?
private void PullTablePages()
{
var taskList = new List<Task>();
var faultedList = new List<Task>();
foreach (var featureItem in featuresWithDataName)
{
var task = Task.Run(() => PullTablePage();
taskList.Add(task);
if(taskList.Count == Constants.THREADS)
{
var index = Task.WaitAny(taskList.ToArray());
taskList.Remove(taskList[index]);
}
}
if (taskList.Any())
{
Task.WaitAll(taskList.ToArray());
}
//todo: do something with faulted list
}
当我如下重写它时,代码不会阻塞,并且控制台应用程序在大多数线程完成之前完成。
看起来 await 语法没有像我预期的那样阻塞。
private async void PullTablePagesAsync()
{
var taskList = new List<Task>();
var faultedList = new List<Task>();
foreach (var featureItem in featuresWithDataName)
{
var task = Task.Run(() => PullTablePage();
taskList.Add(task);
if(taskList.Count == Constants.THREADS)
{
var anyFinished = await Task.WhenAny(taskList.ToArray());
await anyFinished;
for (var index = taskList.Count - 1; index >= 0; index--)
{
if (taskList[index].IsCompleted)
{
taskList.Remove(taskList[index]);
}
}
}
}
if (taskList.Any())
{
await Task.WhenAll(taskList);
}
//todo: what to do with faulted list?
}
有可能吗?
WaitAll 似乎并未等待所有任务完成。我如何让它这样做?返回类型表示它返回一个任务,但似乎无法弄清楚语法。## Heading ##
多线程新手,请见谅。
【问题讨论】:
-
将
PullTablePagesAsync的返回类型更改为Task并在您的主函数/循环中等待它。 -
你到底想在这里做什么?您的代码目前没有多大意义。
-
运行任务列表。如果一个完成,则开始另一个,直到一次完成 4 个限制
-
Async/await 不用于重写阻塞代码。事实上,它们是专门设计为非阻塞的。这个问题没有意义。
-
async void仅用于与事件兼容。如果PullTablePagesAsync不是事件处理程序(它看起来不像),则不应使用async void。见“Async/Await - Best Practices in Asynchronous Programming”
标签: c# multithreading asynchronous async-await c#-5.0