Приложение зависает при использовании второго концентратора из первого концентратора - PullRequest
0 голосов
/ 13 января 2019

В моем приложении у меня есть 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 () Подождите ();.

Проблема в том, что я запускаю второе соединение в форме, которая открывается внутри задачи? Есть ли решение этой проблемы?

1 Ответ

0 голосов
/ 13 января 2019

.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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...