Приложение называется интерфейсом, который был настроен для другого потока - приложение для Windows Store
Итак, сначала я прочитал тон нитей по этой конкретной проблеме, и я до сих пор не понимаю, как это исправить. В принципе, я пытаюсь общаться с веб-сайтом и хранить сообщение, полученное в наблюдаемой коллекции, связанной с списком. Я знаю, что я правильно получаю ответ от сокета, но когда он пытается добавить его в наблюдаемую коллекцию, он вызывает следующую ошибку:
The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
Я прочитал некоторую информацию о "отправке", а также о некоторых других вещах, но я просто очень смущен! Вот мой код:
public ObservableCollection<string> messageList { get; set; }
private void MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
{
string read = "";
try
{
using (DataReader reader = args.GetDataReader())
{
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
read = reader.ReadString(reader.UnconsumedBufferLength);
}
}
catch (Exception ex) // For debugging
{
WebErrorStatus status = WebSocketError.GetStatus(ex.GetBaseException().HResult);
// Add your specific error-handling code here.
}
if (read != "")
messageList.Add(read); // this is where I get the error
}
И это привязка:
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
//await Authenticate();
Gameboard.DataContext = Game.GameDetails.Singleton;
lstHighScores.ItemsSource = sendInfo.messageList;
}
Как сделать ошибку уйти, все еще привязывая к наблюдаемой коллекции для моего списка?
Ответы
Ответ 1
Это решило мою проблему:
Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
// Your UI update code goes here!
}
);
Правильный способ получения CoreDispatcher в приложении Windows Store
Ответ 2
Попробуйте заменить
messageList.Add(read);
с
Dispatcher.Invoke((Action)(() => messageList.Add(read)));
Если вы вызываете извне свой класс Window, попробуйте:
Application.Current.Dispatcher.Invoke((Action)(() => messageList.Add(read)));