C# 如何在异步方法中启动一个新的 "thread"?
C# how to start a new "thread" in an async method?
我有两个异步方法,Test1 和 Test2。
在 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();
}
如果您要求 Test1
在 Test2
调用后立即继续执行,则必须将其调度到 ThreadPool
的另一个线程,这可以通过 [=24] 完成=],例如:
public async Task Test1()
{
var _ = Task.Run(() => Test2());
}
在这种情况下,当 Test2
实际上被 ThreadPool
执行时,您没有控制权(可能 Test1
甚至在 Test2
开始之前就退出了) 和由 Task.Run
编辑的任务 return 只有在 Task2
退出或抛出错误时才会完成。因此,如果您的逻辑不关心结果,您可以 await
它或稍后在您的代码中使用该任务,或者干脆忽略它。
而且如果你不打算等待 Test2
方法的任务,那么值得直接捕获其中 handle/log 可能的错误,否则它会默默地失败,这可能会导致难以调查问题。
我有两个异步方法,Test1 和 Test2。
在 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();
}
如果您要求 Test1
在 Test2
调用后立即继续执行,则必须将其调度到 ThreadPool
的另一个线程,这可以通过 [=24] 完成=],例如:
public async Task Test1()
{
var _ = Task.Run(() => Test2());
}
在这种情况下,当 Test2
实际上被 ThreadPool
执行时,您没有控制权(可能 Test1
甚至在 Test2
开始之前就退出了) 和由 Task.Run
编辑的任务 return 只有在 Task2
退出或抛出错误时才会完成。因此,如果您的逻辑不关心结果,您可以 await
它或稍后在您的代码中使用该任务,或者干脆忽略它。
而且如果你不打算等待 Test2
方法的任务,那么值得直接捕获其中 handle/log 可能的错误,否则它会默默地失败,这可能会导致难以调查问题。