调用长时间运行的方法并继续执行其他任务

本文关键字:继续 执行 其他 任务 方法 长时间 运行 调用 | 更新日期: 2023-09-27 18:23:48

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

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

在 C# 5.0 模式下,我的PerformLongTask()应该如何?

我需要使用async/await吗?

调用长时间运行的方法并继续执行其他任务

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

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(); }
);

假设您使用的是 C# 5,并且所有 Task(( 方法都真正返回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;
}

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

public class PerformMainTask()
{
    Task1();
    Task2();
    Task.WaitAll(Task.Factory.StartNew(() => PerformLongTask()), Task.Factory.StartNew(() => { Task3(); Task4(); }));
}