等待多个可选任务

Juh*_*gas 1 .net c# asynchronous task

您好我想知道是否有更简洁的方法来编写下面的异步代码.基本上我想等待所有任务,但其中一个任务是可选的.感觉不必要的复杂的,想如果我能做到这一点通过一些回调,但一直没能弄明白.

var mobile = true;

var task1 = _service.Async1();
var tasks = new List<Task>
{
    task1
};

Task<int> task2 = null;
if (!mobile)
{
    task2 = _service.Async2();
    tasks.Add(task2);
}

await Task.WhenAll(tasks);

var result1 = task1.Result;

if (!mobile)
{
    result2 = task2.Result;
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 5

无需创建列表并立即等待所有结果.await你需要的时候为什么不呢?如果task2运行时间超过task1,则至少可以在task2完成之前开始处理它.

像这样的东西:

var task1 = _service.Async1();

Task<int> task2 = null;
if (!mobile)
{
    task2 = _service.Async2();
}

var result1 = await task1;

if (!mobile)
{
    var result2 = await task2;
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 一个行为改变你的代码确实我刚才意识到.如果`task2`是一个例外而``mobile`是'true`,那么OP的代码会从`Task.WhenAll`引发异常,你的代码会使异常不被观察到.这样做没有任何问题,这只是OP应该注意的行为改变.它还允许您在"task2"仍在运行的情况下离开代码块的范围.如果`_service.Async3()`稍后出现并且在启动时不需要运行其他操作,这也可能导致问题.再一次,它没有任何问题,只要注意副作用. (2认同)