我有一个.NET客户端应用程序,连接到一个托管有.net mvc5 webapp的SignalR Hub。客户端应用程序的主要例程:
int num1 = _myService.GetSomeHubMethod();
int num2 = _myService.GetSomeOtherHubMethod();
...
其中_myService是类的实例:
public class MyService
{
...
private HubConnection connection;
private IHubProxy hubProxy;
...
public MyService()
{
...
if (BASE_SITE_URL == null)
BASE_SITE_URL = ConfigurationManager.AppSettings["BASE_SITE_URL"].ToString();
if (connection == null)
connection = new HubConnection(BASE_SITE_URL);
if (hubProxy == null)
hubProxy = connection.CreateHubProxy("MyHub");
connection.Start().Wait();
}
...
public int GetSomeHubMethod()
{
//connection.Start().Wait();
var t = hubProxy.Invoke<int>("SomeHubMethod");
int result = t.Result;
//connection.Stop();
return result;
}
public int GetSomeOtherHubMethod()
{
//connection.Start().Wait();
var t = hubProxy.Invoke<int>("SomeOtherHubMethod");
int result = t.Result;
//connection.Stop();
return result;
}
}
和SignalR集线器(服务器端)中的两个集线器方法是:
public class MyHub : Hub
{
...
public int SomeHubMethod()
{ return 1; }
public int SomeOtherHubMethod()
{ return 2; }
}
问题是:第一个呼叫被正确评估,但第二个呼叫“挂起”了 int result = t.Result; 线。特别是,t.Status是“WaitingForActivation”。
如果我在主程序中切换两个调用的顺序,则执行第一个调用,并且秒“挂起”。
注意:如果我在两个方法内部启动和停止连接(参见注释行)而不是在MyService的构造函数中调用connection.Start()。Wait(),它工作正常,但它需要太多时间停下来开始。
感谢大家的帮助!
答案 0 :(得分:1)
好吧,这似乎是一个僵局。我不得不这样修改方法:
public async Task<int> SomeHubMethod()
{
return await Task.FromResult<int>(1);
}
...
public async Task<int> GetSomeHubMethod()
{
return await chatHubProxy.Invoke<int>("SomeHubMethod");
}
...
int num1 = await _myService.GetSomeHubMethod();
好的,我承认我仍然需要做很多与异步相关的工作......