mat*_*ras 4 .net c# multithreading task-parallel-library async-await
我对TPL有一些问题.如您所见,我正在创建2个简单任务并将它们添加到列表中.问题(预期的行为)是任务在点击"等待"后立即返回,WorkMethodAsync因此渲染Task.WhenAll无用.有没有办法等待子任务完成?我发现的唯一解决方法是伪装WorkMethodAsync成同步.
private async void button1_Click(object sender, EventArgs e)
{
    Tasks = new List<Task>();
    var myTask1 = Task.Factory.StartNew(async () => await WorkMethodAsync(), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
    var myTask2 = Task.Factory.StartNew(async () => await WorkMethodAsync(), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
    Tasks.Add(myTask1);
    Tasks.Add(myTask2);
    await Task.WhenAll(Tasks.ToArray());
}
private async Task WorkMethodAsync()
{
    while (true)
    {
        await Task.Delay(10000);
    }
    return;
}
问题是你用的是Task.Factory.StartNew代替Task.Run.
StartNew是在async-await之前构建的,因此不能很好地支持它.在这种情况下,因为您的委托返回一个任务并StartNew创建一个返回值为的任务Task<Task>>.您可以使用Unwrap获取代表整个异步操作的任务:
Task<Task> myTask1 = Task.Factory.StartNew(async () => await WorkMethodAsync(), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
Task<Task> myTask2 = Task.Factory.StartNew(async () => await WorkMethodAsync(), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
Tasks.Add(myTask1.Unwrap());
Tasks.Add(myTask2.Unwrap());
但是,真的没有理由Task.Factory.StartNew开始使用,因为TaskCreationOptions.LongRunning对于异步方法没有意义(更多关于我的博客:LongRunning对于Task.Run使用async-await是无用的)所以你可以使用Task.Run:
var myTask1 = Task.Run(() => WorkMethodAsync());
var myTask2 = Task.Run(() => WorkMethodAsync());