在C#中,这两个语句有什么区别?如果我在我的测试类构造函数中使用第一个语句,会导致死锁或类似的问题,测试永远不会完成。而使用第二个语句时,代码可以正常工作。
更新:在这个提交中有更多的背景信息:https://github.com/webCRMdotcom/erp-integrations/pull/92/commits/dd8af89899ce1de837ef6e34f0688a685a5cea3b。
// Deadlock.
var r = MyMethod().Result;
// Works.
var r = Task.Run(() => MyMethod()).Result;
更新:在这个提交中有更多的背景信息:https://github.com/webCRMdotcom/erp-integrations/pull/92/commits/dd8af89899ce1de837ef6e34f0688a685a5cea3b。
MyMethod
返回一个Task<T>
,那么第一种方法会导致死锁,而第二种方法仅将Task<T>
分配给r
,而没有获取该Task
的结果(在这种情况下,Task.Run
最终创建了一个Task<Task<T>>
)。 - Damien_The_Unbelieverr
被赋值为类型T
,而不是Task<T>
。也许这在某个时候已经改变了,因为 @Chrᴉz 也指出了这一点,但我无法确认。我添加了一个链接到提交,以便有更多的上下文。 - Jan Aagaard