【问题标题】:Application hangs when using a second hub from within the first hub从第一个集线器中使用第二个集线器时应用程序挂起
【发布时间】:2019-01-13 17:04:56
【问题描述】:

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

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

【问题讨论】:

    标签: c# winforms signalr


    【解决方案1】:

    .Wait() 正在阻塞调用,这可能导致解除锁定。您应该等待从Start() 返回的Task,例如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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多