C# 避免在此场景中使用wait

C# 避免在此场景中使用wait,c#,async-await,C#,Async Await,我有一个异步调用,我将它包装在一个任务中。运行以在另一个线程中运行它。组织分配和所有后续代码是否会停止,直到返回并获得结果?或者,当它到达foreach时,它会继续并有时生成空引用异常吗?在我的测试中,它从不出错,但也许我只是幸运而已 IDictionary<string, organization> organizations = Task.Run(() => this.GetOrganizationsAsync()).Result; ...lines of

我有一个异步调用,我将它包装在一个任务中。运行以在另一个线程中运行它。组织分配和所有后续代码是否会停止,直到返回并获得结果?或者,当它到达foreach时,它会继续并有时生成空引用异常吗?在我的测试中,它从不出错,但也许我只是幸运而已

        IDictionary<string, organization> organizations = Task.Run(() => this.GetOrganizationsAsync()).Result;

...lines of code

        foreach (var organization in organizations)
        {
IDictionary organizations=Task.Run(()=>this.GetOrganizationsAsync()).Result;
…代码行
foreach(组织中的var组织)
{

调用.Result是一个坏主意,因为它有时会导致代码锁定——我建议您阅读一些资料,让自己相信情况就是这样

最好的方法是调用GetOrganizationsAsync上的await并使执行它的方法异步。这可能意味着Async方法开始在代码中传播,但这正是cookie崩溃的原因。有一些方法可以避免这样做,我看到它是在生产代码中编写的,而生产代码中的大部分都是有效的是的,但我不推荐

以下是关于该主题的更多阅读:

调用.Result是一个坏主意,因为它有时会导致代码锁定——我建议您阅读一些资料,让自己相信情况就是这样

最好的方法是调用GetOrganizationsAsync上的await并使执行它的方法异步。这可能意味着Async方法开始在代码中传播,但这正是cookie崩溃的原因。有一些方法可以避免这样做,我看到它是在生产代码中编写的,而生产代码中的大部分都是有效的是的,但我不推荐

以下是关于该主题的更多阅读:

报纸上说:

访问属性的get访问器会阻止调用线程,直到异步操作完成;这相当于调用Wait方法

因此,是的,在
GetOrganizationsAsync()
完成之前,它不会继续进行。但有两件事:

  • 没有理由使用
    Task.Run
    。当您希望某个线程移动到另一个线程,以便当前线程可以继续执行其他任务时,可以使用它。但是,您会阻止当前线程,直到它完成为止。因此
    Task.Run
    只是无缘无故地增加了开销

  • 异步操作上的阻塞也会导致死锁问题:

  • 任何原因都不能使方法
    异步
    并使用
    等待GetOrganizationsSync()
    ?这是更可取的,因为您不会阻塞任何线程

    微软有一系列写得很好的文章值得一读。

    文章说:

    访问属性的get访问器会阻止调用线程,直到异步操作完成;这相当于调用Wait方法

    因此,是的,在
    GetOrganizationsAsync()
    完成之前,它不会继续进行。但有两件事:

  • 没有理由使用
    Task.Run
    。当您希望某个线程移动到另一个线程,以便当前线程可以继续执行其他任务时,可以使用它。但是,您会阻止当前线程,直到它完成为止。因此
    Task.Run
    只是无缘无故地增加了开销

  • 异步操作上的阻塞也会导致死锁问题:

  • 任何原因都不能使方法
    异步
    并使用
    等待GetOrganizationsSync()
    ?这是更可取的,因为您不会阻塞任何线程


    微软有一系列写得很好的文章值得一读。

    在一个单独的线程上运行
    GetOrganizationsAsync
    有什么好处?如果它是一个真正的异步操作(最终等待网络、磁盘、数据库等)然后可以调用
    getorganizationsasync
    ,存储任务,然后在需要结果时调用
    wait
    。这将允许线程启动异步操作,继续执行所需的所有其他工作,以及在需要操作结果等待时(但不阻止线程)对于结果。结果是一个阻塞调用,可能导致死锁。您应该避免它。永远不要这样做。如果您希望工作流同步运行,那么首先不要异步运行它。不要异步运行它,然后危险地引入同步等待!正确的异步多线程工作流是工作流四:请一名工作人员修剪草坪,在异步等待的同时,找到其他要做的事情,包括查找割草机。继续查找其他要做的任务,直到草坪修剪完毕,然后吃午饭。可以使用异步;使用异步。在单独的t上运行
    GetOrganizationsAsync
    ,您希望得到什么好处线程?如果它是真正的异步操作(最终在网络、磁盘、数据库等上等待)然后可以调用
    getorganizationsasync
    ,存储任务,然后在需要结果时调用
    wait
    。这将允许线程启动异步操作,继续执行所需的所有其他工作,以及在需要操作结果等待时(但不阻止线程)对于结果。结果是一个阻塞调用,可能导致死锁。您应该避免它。永远不要这样做。如果您希望工作流同步运行,那么首先不要异步运行它。不要异步运行它,然后危险地引入同步等待!正确的异步多线程工作流是工作流四:请一名工作人员为您修剪草坪,在您异步等待的同时,找到其他要做的事情,包括查找割草机。继续查找其他要做的任务,直到草坪修剪完毕,然后吃午饭。异步是可以使用的;请使用它。