Есть вот такой код клиента:
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 не помогает.