被调用的代码可以确定是否使用“await”vs“.wait()”调用它

时间:2014-08-12 17:05:26

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

我有一个带有以下代码的.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()的用例,可以抛出异常。

1 个答案:

答案 0 :(得分:6)

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

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

objConnection.Start().Wait();

与:

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

和代码:

await objConnection.Start();

与:

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

因此Start明确没有(理智)方式知道代码在被调用之后会做什么。