小编Kru*_*odi的帖子

为什么在Task.Run()工作时ConfigureAwait(false)不起作用?

我正在使用ConfigureAwait(false)调用异步库方法.但是,我仍然陷入僵局.(我在ASP.NET控制器API中使用它)但是,如果我使用包装到Task.Run()中的相同方法,它工作正常.

我的理解是,如果库方法没有在内部使用ConfigureAwait,那么添加ConfigureAwait将无法解决问题,因为在库调用中它将导致死锁(我们使用.Result阻止它).但是,如果是这样的话,为什么它在Task.Run()中工作,因为它将无法在相同的上下文/线程中继续.

文章谈论它.顺便说一句,我已经准备好斯蒂芬克莱里的很多文章了.但是,为什么Task.Run()工作是一个谜.

代码段:

// This Create Method results in Deadlock
public async Task<string> Create(MyConfig config)
{
        Document doc = await Client.CreateDocumentAsync(CollectionUri, config).ConfigureAwait(false);
        return doc.Id;
}

// Uses Task.Run() which works properly, why??
public string Create(MyConfig config)
{
    Document doc = Task.Run(() => Client.CreateDocumentAsync(CollectionUri, config)).Result;
    return doc.Id;
}

[HttpPost]
public ActionResult CreateConfig(MyConfig config)
{
     string id = Create(config).Result;
     return Json(id);
}
Run Code Online (Sandbox Code Playgroud)

c# async-await configureawait

9
推荐指数
2
解决办法
4395
查看次数

标签 统计

async-await ×1

c# ×1

configureawait ×1