@DarkByte2015

Почему падает ошибка?

Есть вот такой код клиента:
private void btChangeState_Click(object sender, RoutedEventArgs e)
{
    if (!IsConnected)
    {
        Exception error = null;

        if (!TryConnect($"net.tcp://{tbIP.Text}:{tbPort.Text}/JobService", out Proxy, out error))
        {
            MessageBox.Show(error.Message, "Error!", MessageBoxButton.OK, MessageBoxImage.Error);
            return;
        }
    }
    else
    {
        Proxy.Close();
    }

    IsConnected = !IsConnected;
    Jobs.Clear();
}

private bool TryConnect(string endpoint, out JobServiceClient proxy, out Exception error)
{
    try
    {
        var callback = new ClientCallback();
        callback.GiveJob += Callback_GiveJobAsync;
        var ctx = new InstanceContext(callback);
        proxy = new JobServiceClient(ctx);
        proxy.Endpoint.Address = new EndpointAddress(endpoint);
        proxy.Connect();
        error = null;
        return true;
    }
    catch (Exception e)
    {
        proxy = null;
        error = e;
        return false;
    }
}

Почему при вызове Connect у меня падает такая ошибка? "Данный тип CollectionView не поддерживает изменения в своем SourceCollection из потока, отличного от потока Dispatcher." Никакие дополнительные потоки в данном случае не используются, все в основном.

Сейчас доперло отлаживать не клиент на котором ошибка выскакивает, а сервер, где собственно и вызывается функция Connect через прокси. Походу ошибка именно там. Но почему она выскакивает я все равно не понимаю... В контракте сервиса есть коллекция:
public ObservableCollection<ClientView> Clients { get; } = new ObservableCollection<ClientView>();
В функции Connect как раз создается объект ClientView и добавляется в нее. И именно при этом добавлении (согласно отладчику) падает ошибка, которая просто передается клиенту. Но все происходит в одном потоке, никаких лишних потоков там нет! Откуда же ошибка?

P.S. Dispatcher.Invoke не помогает.
  • Вопрос задан
  • 1100 просмотров
Решения вопроса 1
@DarkByte2015 Автор вопроса
Как выяснилось опытным путем проблема была в том что кнопка запускающая сервер имела асинхронный обработчик. Не понятно совершенно как, но как то он влиял на это, поскольку стоило сделать его синхронным, как ошибка пропала.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Hydro
C#/.NET Developer
Никакие дополнительные потоки в данном случае не используются, все в основном.


Это Вы так думаете.
WCF под собой прячет очень много логики, которая может работать потоках, отличных от основного.
Ошибка, которую Вы словили явно указывает, что добавление в коллекцию происходит не в UI потоке.
Чтобы пофиксить надо было вызвать Invoke у Dispatcher'а приложения, и только так, через Application.Current.Dispatcher.Invoke. А Dispatcher.Current может быть совсем иным, зависит от контекста синхронизации.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы