您好我有以下代码来创建任务。然后将其设置为开始。
该任务旨在添加对ConcurrentBag
列表的响应。
但等待似乎并不等待完成所有任务。但他们被标记为已完成。列表中只有一个任务。
使用Task.Run
时,它可以正常工作!
public async void RunT1()
{
DoesNotWork();
}
public async void RunT2()
{
DoesWork();
}
public async void DoesNotWork()
{
ConcurrentBag<string> concurrentBag = new ConcurrentBag<string>();
List<Task> taskList = new List<Task>();
Task task1 = new Task(async () =>
{
var xml = await LongWorkingMethod();
concurrentBag.Add(xml);
});
taskList.Add(task1);
taskList[0].Start();
await Task.WhenAll(taskList);
if (concurrentBag.Count > 0)//concurrentBag is empty even though the task has finished
{
Debug.Print("success");
}
}
public async void DoesWork()
{
ConcurrentBag<string> concurrentBag = new ConcurrentBag<string>();
List<Task> taskList = new List<Task>();
Task task1 = Task.Run(async () =>
{
var xml = await LongWorkingMethod();
concurrentBag.Add(xml);
});
taskList.Add(task1);
await Task.WhenAll(taskList);
if (concurrentBag.Count > 0)//concurrentBag is NOT empty
{
Debug.Print("success");
}
}
答案 0 :(得分:6)
几乎没有理由直接使用Task
构造函数。
在您的情况下,Task
构造函数不支持async
代理(即Action
代替Func<Task>
),当您传递一个作为参数时它被视为async void
。
这意味着调用Start
&#34;触发并忘记&#34; 代理,它不能等待其中的异步操作完成,因为&# 39; s上没有Task
到await
。
var task = new Task(async () => await Task.Delay(1000));
task.Start();
await task; // completes immediately
如果您需要运行新的Task.Run
,请使用Task
。如您所见,Task.Run
确实支持async
委托,并等待整个操作完成
var task = Task.Run(async () => await Task.Delay(1000));
await task; // completes after 1000 milliseconds