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)并避免了上下文切换。
发布于 2015-10-21 15:40:20
ConfigureAwait是一种纯方法。它返回一个值,但对其本身没有任何影响。它返回需要等待的自定义awaitable (ConfiguredTaskAwaitable):
await task.ConfigureAwait();但是,您不应该这样处理死锁。这是一种预防措施,但首先您应该避免阻塞异步代码。
https://stackoverflow.com/questions/33263497
复制相似问题