C#中的Foo()。Result和Task.Run(()=> Foo())。Result有什么区别?

扬·阿加德(Jan Aagaard)

在C#中,这两个语句之间有什么区别?如果在测试类中的构造函数中使用第一个,则会出现死锁或类似的问题,并且测试将永远无法完成。与第二个代码一起工作。

// Deadlock.
var r = MyMethod().Result;

// Works.
var r = Task.Run(() => MyMethod()).Result;

更新:此提交中有更多上下文:https : //github.com/webCRMdotcom/erp-integrations/pull/92/commits/dd8af89899ce1de837ef6e34f0688a685a5cea3b

鲁佛爵士

区别在于启动线程上下文。

这是一个简单的示例

using System;
using System.Threading.Tasks;

public class Program
{
    public static void Main()
    {
        string r;
        OutputThreadInfo("Main");
        r = MyMethod().Result;
        r = Task.Run( () => MyMethod() ).Result;
    }

    public static async Task<string> MyMethod()
    {
        OutputThreadInfo("MyMethod");
        await Task.Delay(50);
        return "finished";
    }

    private static void OutputThreadInfo(string context)
    {
        Console.WriteLine("{0} {1}",context,System.Threading.Thread.CurrentThread.ManagedThreadId);
    }
}

.net小提琴

将输出

主要32 
MyMethod 32 
MyMethod 63

MyMethod的第一次调用将在与Main相同的线程处开始​​,如果从具有同步上下文的线程开始,它将被阻止。

MyMethod的第二次调用将从与Main不同的线程(线程池中的工作线程)开始,该线程没有同步上下文,因此不会阻塞。

PS:请记住,控制台应用程序没有默认的同步上下文,但WinForms,WPF,UWP应用程序确实具有同步上下文,因此在异步/等待时的行为会有所不同

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Bash 中的 `declare foo` 和 `foo=` 有什么区别?

/ tmp和/ run有什么区别?

Clojure中的:foo,:: foo,:: bar / foo和:bar / foo有什么区别?

&foo :: function和foo :: function有什么区别?

ifeq($(foo),)和ifndef foo有什么区别

location / foo和location ^〜/ foo有什么区别

使用params [:foo]和@foo有什么区别?

python中装饰器中的foo=bar(foo)和something=bar(foo)有什么区别?

在 C++ 类成员函数中调用 foo() 和 ::foo() 有什么区别?

docker run和docker container run有什么区别

Task.Run(Foo)和FooAsync()有什么不同?

dockerfile中的RUN和bash脚本有什么区别?

方法调用语法`foo.method()`和UFCS`Foo :: method(&foo)`有什么区别?

Throw'foo',throw Error('foo'),throw new Error('foo')和有什么区别?

Scala中的s“ foo $ bar”和“ foo%s” .format(bar)有什么区别

TypeScript中的类型化数组-Array <Foo>和Foo []有什么区别?

在Python中从`foo.py`导入和`foo / __ init __。py`导入之间有什么区别

Task.Run()和await Task.Run()有什么区别?

docker run 和 docker pull 有什么区别

Thread start()和Runnable run()有什么区别

yarn run和npm start有什么区别?

npm install和npm run build有什么区别?

yarn run和npm start有什么区别?

Task.Yield,Task.Run和ConfigureAwait(false)有什么区别?

Task.Run和Task.Factory.StartNew有什么区别

未等待的Task.Run和Task.RunSynchronously有什么区别

“ $ {foo.bar}”和“#{foo.bar}”之间有什么区别?

$ bar = boolval($ foo)和$ bar =(bool)$ foo在php中有什么区别?

“git merge foo”和“git merge origin/foo”有什么区别?