从第一个集线器中使用第二个集线器时,应用程序挂起

时间:2019-01-13 17:04:57

标签: c# winforms signalr

在我的应用程序中,我有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();

问题是因为我要在任务中打开的表单中启动第二个连接吗?有解决这个问题的方法吗?

1 个答案:

答案 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();
}