【发布时间】:2023-03-31 19:47:02
【问题描述】:
我有一个在 thread1 上运行的代码。 我以同步方式调用函数(使用异步方法,但它不应该打扰我 - 异步方法不会将代码变为异步)。
我有一个将 ConfigureAwait 设置为 false 的等待,所以我理解 之后的代码是任务延续,假设在 不同 线程中运行,而不是在等待之前的代码 (因为 ConfigureAwait 设置为 false)。
根据我的测试 - 所有代码都在同一个线程中运行。 如何?为什么等待下面的代码不在不同的线程上运行? 这是代码:
public async void F1()
{
Console.WriteLine($"Thread.CurrentThread.ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
int x = await F2().ConfigureAwait(false);
Console.WriteLine($"Thread.CurrentThread.ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
}
private async Task<int> F2()
{
Console.WriteLine("Begins F2");
Console.WriteLine($"Thread.CurrentThread.ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine("Finishes F2");
return 7;
}
这是输出:
Thread.CurrentThread.ManagedThreadId=1
Begins F2
Thread.CurrentThread.ManagedThreadId=1
Finishes F2
Thread.CurrentThread.ManagedThreadId=1
【问题讨论】:
-
您的代码实际上不是异步的。尝试至少将
await Task.Delay(...)或Task.Yield添加到F2 -
抛开问题不谈,
async void是一种反模式,在大多数情况下不应使用:markheath.net/post/async-antipatterns
标签: c# .net multithreading async-await configureawait