【问题标题】:Can called code determine if it's being called with "await" vs ".wait()"可以调用代码确定它是否被“await”与“.wait()”调用
【发布时间】:2014-08-13 01:10:57
【问题描述】:

我有一个带有以下代码的 .NET SignalR 客户端:

   IHubProxy proxy = objConnection.CreateHubProxy("stockTicker");
   objConnection.Start().Wait();
   Console.WriteLine(objConnection.ConnectionId);

问题是客户端在 30 秒后挂起,需要重新连接。解决方法是更改​​ Wait 方法:

   IHubProxy proxy = objConnection.CreateHubProxy("stockTicker");
   await objConnection.Start();
   Console.WriteLine(objConnection.ConnectionId); 

我看不出人们有理由在 SignalR 上或在其他一些情况下调用“等待”。有没有办法让被调用的代码(本例中为Start())知道它的调用方式?

这个想法是,对于不应该是Waited() 的用例,可以抛出异常。

【问题讨论】:

  • 我会编写一个在这两种情况下都可以工作的代码,而不是检测它是如何被调用的......
  • 我能想到的唯一方法是使用自定义等待(即不是Task),但我认为这不是一个合理的解决方案。

标签: c# multithreading task-parallel-library signalr async-await


【解决方案1】:

没有。但是,我希望像 ReSharper 这样的静态分析工具能够在不久的将来对这些情况发出警告。您甚至可以编写自己的警告,例如,使用 Roslyn 或 Re# 插件。

这是不可能的原因是因为代码:

objConnection.Start().Wait();

等同于:

var task = objConnection.Start();
task.Wait();

和代码:

await objConnection.Start();

等同于:

var task = objConnection.Start();
await task;

因此,Start 显然没有(理智的)方法知道代码在调用后会做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多