3
public class PerformMainTask()
{
    Task1();
    Task2();
    PerformLongTask();
    Task3();
    Task4();
}

我想在这里实现的是PerformLongTask()到另一个线程,并继续使用 Task3 和 Task4,即使PerformLongTask()仍在运行。

我应该如何PerformLongTask()以 C# 5.0 的方式呈现?

我需要使用async/await吗?

4

3 回答 3

4

我知道的最简单的解决方案是:

Task1();
Task2();
var task3 = Task.Run(() => PerformLongTask());
Task4();
Task5();
task3.Wait(); //if task3 has not started yet it will be inlined here

简单高效。如果您需要传播错误,您可能应该使用Parallel.Invoke

Parallel.Invoke(
 () => { PerformLongTask(); },
 () => { Task4(); Task5(); }
);
于 2013-07-18T10:37:52.427 回答
2

假设您使用的是 C# 5 并且您的所有 Task() 方法都真正返回 a Task(或任何可等待的),您的代码应如下所示:

public async Task PerformMainTask()
{
    await Task1();
    await Task2();
    // Start long task
    var longTask = PerformLongTask();
    await Task3();
    await Task4();
    //wait for long task to finish
    await longTask;
}

但是,如果您的长任务不能自行并行运行,您可以强制它这样做Task.Run

public async Task PerformMainTask()
{
    await Task1();
    await Task2();
    // Start long task
    var longTask = Task.Run(PerformLongTask);
    await Task3();
    await Task4();
    //wait for long task to finish
    await longTask;
}

如果您的任务都不是真正的任务,只需去掉除最后一个之外的所有等待,您就可以开始了。

于 2013-07-18T11:32:21.673 回答
0
public class PerformMainTask()
{
    Task1();
    Task2();

    Task.WaitAll(Task.Factory.StartNew(() => PerformLongTask()), Task.Factory.StartNew(() => { Task3(); Task4(); }));
}
于 2013-07-18T10:28:40.347 回答