Task.Start奇怪的行为

时间:2015-02-12 07:34:59

标签: c# .net task-parallel-library async-await

您好我有以下代码来创建任务。然后将其设置为开始。 该任务旨在添加对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");
    }
}

1 个答案:

答案 0 :(得分:6)

几乎没有理由直接使用Task构造函数。

在您的情况下,Task构造函数不支持async代理(即Action代替Func<Task>),当您传递一个作为参数时它被视为async void

这意味着调用Start &#34;触发并忘记&#34; 代理,它不能等待其中的异步操作完成,因为&# 39; s上没有Taskawait

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