首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SynchronizationContext -奇怪的行为

SynchronizationContext -奇怪的行为
EN

Stack Overflow用户
提问于 2015-10-21 15:36:45
回答 1查看 46关注 0票数 1
代码语言:javascript
复制
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)并避免了上下文切换。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-21 15:40:20

ConfigureAwait是一种纯方法。它返回一个值,但对其本身没有任何影响。它返回需要等待的自定义awaitable (ConfiguredTaskAwaitable):

代码语言:javascript
复制
await task.ConfigureAwait();

但是,您不应该这样处理死锁。这是一种预防措施,但首先您应该避免阻塞异步代码。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33263497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档