在我的应用程序中,我有2个集线器(并使用2个独立的连接)。一个集线器及其连接是从一个类中创建的。表单中的另一个。
在第一个代理中,我这样做:
var uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()
workProxy.On("DoWork", () =>
{
Task.Factory.StartNew(() =>
{
OnDoWork?.Invoke(this, new EventArgs());
},
CancellationToken.None, TaskCreationOptions.None, uiTaskScheduler);
});
我正在执行上述操作,因为我正在On
中打开一个表单,如果不执行上述操作,则会收到跨线程异常。
第二个表单订阅了OnDoWork事件,这又打开了具有集线器连接和代理的实际表单。
在表单的OnShown
事件中,我这样做:
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
hubConnection = new HubConnection("myhubsurl");
hubProxy = hubConnection.CreateHubProxy("SecondHub");
doWork = hubProxy.On<IEnumerable<Item>>("DoWork", items => WorkOnItems(items));
hubConnection.Start().Wait();
}
可以直接打开表单,而无需从第一个代理调用。在这种情况下,一切正常。但是,当我从第一个代理中打开表单时,应用程序挂在此行上:
hubConnection.Start()。Wait();
问题是因为我要在任务中打开的表单中启动第二个连接吗?有解决这个问题的方法吗?
答案 0 :(得分:0)
.Wait()
正在阻止可能导致脱机的调用。您应该等待Task
返回的Start()
,例如。 await hubConnection.Start()
,为此,您需要使OnShown
事件异步。
protected async override void OnShown(EventArgs e)
{
base.OnShown(e);
hubConnection = new HubConnection("myhubsurl");
hubProxy = hubConnection.CreateHubProxy("SecondHub");
doWork = hubProxy.On<IEnumerable<Item>>("DoWork", items => WorkOnItems(items));
await hubConnection.Start();
}