我编写了一个简单的控制台应用程序,测试ConfigureAwait(false)修复在同步方式下调用异步函数的问题。这是我模拟事件并尝试以同步方式调用异步函数的方式。
public static class Test2
{
private static EventHandler<int> _somethingEvent;
public static void Run()
{
_somethingEvent += OnSomething;
_somethingEvent(null, 10);
Console.WriteLine("fetch some other resources");
Console.ReadLine();
}
private static void OnSomething(object sender, int e)
{
Console.WriteLine($"passed value : {e}");
FakeAsync().Wait();
}
private static async Task FakeAsync()
{
await Task.Delay(2000).ConfigureAwait(false);
Console.WriteLine($"task completed");
}
}
代码的输出结果如下:
passed value : 10
task completed
fetch some other resources
当我将OnSomething函数更改为异步无返回值时,如下所示:
private static async void OnSomething(object sender, int e)
{
Console.WriteLine($"passed value : {e}");
await FakeAsync();
}
输出将变为如下内容:
passed value : 10
fetch some other resources
task completed
你可以看到在任务完成部分之前发生了“获取其他资源”的操作,这是我想要的结果。我的问题是如何通过调用异步函数使其与我为OnSomething函数编写的第一个签名同步?我应该如何使用“ConfigureAwait(false)”帮助我解决这个问题?或者我没有正确地使用它。