C# 如何在异步方法中启动一个新的 "thread"?

C# how to start a new "thread" in an async method?

我有两个异步方法,Test1Test2

Test1 中,我想“在新线程中”调用 Test2

换句话说,我想要一个单独的“线程”去执行Test2,而Test1跨过Test2调用,不要等待它完成。

private async Task Test2()
{
    // some time-consuming work to do...
}

public async Task Test1()
{
    // How to call Test2 and immediately move on to the next line and let a separate "thread" to
    // execute Test2?
}

我们假设 Test2 有一些 CPU-intensive 逻辑和一些异步调用:

private async Task Test2()
{
    for (var i = 1; i < 1_000_000; i++)
    {
    }

    await Task.Delay(TimeSpan.FromMinutes(1));

    for (var i = 1; i < 1_000_000; i++)
    {
    }
}

如果在没有 await 的情况下调用 Test2,则当前线程将在 Test2 方法中的第一个 await 之前执行逻辑,然后 returning 到 Test1。这意味着仅在第一个 for 循环完成后,执行才会 return 到 Test1

public async Task Test1()
{
    var _ = Test2();
}

如果您要求 Test1Test2 调用后立即继续执行,则必须将其调度到 ThreadPool 的另一个线程,这可以通过 [=24] 完成=],例如:

public async Task Test1()
{
    var _ = Task.Run(() => Test2());
}

在这种情况下,当 Test2 实际上被 ThreadPool 执行时,您没有控制权(可能 Test1 甚至在 Test2 开始之前就退出了) 和由 Task.Run 编辑的任务 return 只有在 Task2 退出或抛出错误时才会完成。因此,如果您的逻辑不关心结果,您可以 await 它或稍后在您的代码中使用该任务,或者干脆忽略它。

而且如果你不打算等待 Test2 方法的任务,那么值得直接捕获其中 handle/log 可能的错误,否则它会默默地失败,这可能会导致难以调查问题。