SynchronizationContext - 奇怪的行为
SynchronizationContext - strange behavior
public static void Init()
{
//var task = GetSource1();
//var task = GetSource2();
//var task = GetSource3();
var task = MyClient();
MessageBox.Show(task.Result);
}
private static async Task<string> GetSource1()
{
var sourceTask = WebClient();
sourceTask.ConfigureAwait(false);
return await sourceTask;
}
private static async Task<string> GetSource2()
{
var sourceTask = MyClient();
sourceTask.ConfigureAwait(true);
return await sourceTask;
}
private static async Task<string> GetSource3()
{
var sourceTask = MyClient();
sourceTask.ConfigureAwait(false);
return await sourceTask;
}
private static async Task<string> WebClient()
{
return await new WebClient().DownloadStringTaskAsync("http://4pda.ru").ConfigureAwait(false);
}
private static Task<string> MyClient()
{
var t = new Task<string>(() => new WebClient().DownloadString("http://4pda.ru"));
t.ConfigureAwait(false);
t.Start();
return t;
}
这段代码工作正常。我在 MessageBox
中获取源代码。但是,为什么我在使用 var task = GetSource3()
时会出现死锁?我认为它一定有效,因为我使用 ConfigureAwait(false)
并避免上下文切换
ConfigureAwait
是一个纯粹的方法。它 returns 一个值,但对它自己没有影响。它 returns 您需要等待的自定义可等待对象 (ConfiguredTaskAwaitable
):
await task.ConfigureAwait();
但是,这不是您处理死锁的方式。这是一种预防措施,但您应该避免阻塞异步代码。
public static void Init()
{
//var task = GetSource1();
//var task = GetSource2();
//var task = GetSource3();
var task = MyClient();
MessageBox.Show(task.Result);
}
private static async Task<string> GetSource1()
{
var sourceTask = WebClient();
sourceTask.ConfigureAwait(false);
return await sourceTask;
}
private static async Task<string> GetSource2()
{
var sourceTask = MyClient();
sourceTask.ConfigureAwait(true);
return await sourceTask;
}
private static async Task<string> GetSource3()
{
var sourceTask = MyClient();
sourceTask.ConfigureAwait(false);
return await sourceTask;
}
private static async Task<string> WebClient()
{
return await new WebClient().DownloadStringTaskAsync("http://4pda.ru").ConfigureAwait(false);
}
private static Task<string> MyClient()
{
var t = new Task<string>(() => new WebClient().DownloadString("http://4pda.ru"));
t.ConfigureAwait(false);
t.Start();
return t;
}
这段代码工作正常。我在 MessageBox
中获取源代码。但是,为什么我在使用 var task = GetSource3()
时会出现死锁?我认为它一定有效,因为我使用 ConfigureAwait(false)
并避免上下文切换
ConfigureAwait
是一个纯粹的方法。它 returns 一个值,但对它自己没有影响。它 returns 您需要等待的自定义可等待对象 (ConfiguredTaskAwaitable
):
await task.ConfigureAwait();
但是,这不是您处理死锁的方式。这是一种预防措施,但您应该避免阻塞异步代码。