当前位置: 首页 > 知识库问答 >
问题:

传递异步委托totask.run?[副本]

鄢禄
2023-03-14

null

null

我从Stephen Cleary的博客上读到,Task.run应该只用于CPU绑定的操作,显然上传一大块数据不是CPU绑定的。因此,如果我在 中调用 stream)="" ode=""> ,似乎是一种错误的方式。

所以我的问题是,使用Task.Run来包装和调用异步函数是不是一种不好的做法?

共有2个答案

殳飞扬
2023-03-14

await UploadAsync(Sream))/code>将返回一个任务,如果您需要等待它完成,则需要等待它。在Task.run中调用async方法是没有意义的。

您可以对任务调用。wait(),这将阻塞线程,直到请求完成。

异步调用确实有“感染”整个调用树的趋势,但是我还没有找到任何合适的方法来避免这种情况。

韩阳云
2023-03-14

调用该函数将使异步关键字散布整个调用树。

是的,这就是异步代码的要点。如果同步调用异步函数,那么它就不是异步的。

最好的解决方案是采用异步代码,并用 调用它。如果由于某种原因,这不可行,那么您可以使用我的brownfield异步文章中的一个黑客。请注意,并不存在在每个场景中都有效的黑客。

例如,您可以使用线程池黑客:

Task.Run(() => UploadAsync(stream)).GetAwaiter().GetResult();

这会将异步代码包装到后台线程中(避免死锁问题,但也会阻止异步代码使用调用上下文),并阻止等待结果(使用 而不是 以避免错误情况下的 包装器)。

但是,请注意,为异步方法公开同步包装是一种反模式。因此,提供以这种方式实现的 方法将是一个糟糕的设计。

 类似资料:
  • 我已经创建了一个简单的协议委托来将数据从一个视图控制器传递到第二个视图控制器--但是数据似乎没有传递出去? 详细信息:第一个视图控制器有一个textField,我在其中键入数据(字符串),以传递给第二个VC。我也有一个按钮的动作触发过渡到第二视图控制器。第二个视图控制器出现,但来自第一个视图控制器的数据没有显示出来-预期的行为是第二个VC中的标签用来自第一个VC的数据更新。我还创建了一个从FVC到

  • 主要内容:类委托,属性委托,标准委托,可观察属性 Observable,把属性储存在映射中,Not Null,局部委托属性,属性委托要求,翻译规则,提供委托委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口

  • 主要内容:声明委托,实例化委托,多播委托(合并委托)C# 中的委托(Delegate)类似于 C 或 C++ 中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。委托特别适用于实现事件和回调方法,所有的委托都派生自 System.Delegate 类。在实例化委托时,可以将委托的实例与具有相同返回值类型的方法相关联,这样就可以通过委托来调用方法。另外,使用委托还可以将方法作为参数传递给其他方法, 委托具有以下特点: 委托类似

  • 关于“行为委派”的良好讨论可以在 找到。

  • 委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口 Base 所有方法,并且委托一个传入的 Base 类的

  • 我正试图从两个异步函数向一个函数传递两个值,但我不确定如何继续。代码如下: 我知道问题是我在异步函数之外调用函数,所以它不接收数字,它给我一个NAN(不是数字),但我不知道如何正确传递这两个在不同函数中检索的参数,有没有可能将btcPriceInUSD和priceExchangeMXN合并在一起并从那里调用它? 提前道谢!