Я создаю приложение, которое использует два потока, один для всего пользовательского интерфейса, а другой - для фоновой задачи, которая извлекает данные, полученные по последовательной связи.
При запуске моего приложения отображается расширенный заставочный экран, чтобы разблокировать его и перейти на главную страницу, приложение ожидает от сервера сообщение «Пуск».
Когда я получаю сообщение, метод OnTaskCompleted моей фоновой задачи активирует и считывает данные, сохраненные моей фоновой задачей.(см. код ниже).
private void Task_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
{
var taskName = sender.Name; // Affiche le nom de la tâche en background qui renvoi le task completed
Debug.WriteLine(taskName);
var localSettingsData = ApplicationData.Current.LocalSettings; // Créer une variable locale qui stocke en mémoire cache des informations
try
{
args.CheckResult(); // On test si la tâche a bien été terminée
Object value = localSettingsData.Values["data"]; // On va lire dans le champs "data" de notre mémoire
if (value == null) // Test sur notre valeur d'objet
{
Debug.WriteLine("Aucune donnée."); // Affichage en debug si aucune donnée trouvée
}
else
{
Debug.WriteLine("Donnée trouvée."); // Si on trouve une donnée alors, on execute le switch ci-dessous
RecptData.TriMessage(value); // Envoi de notre message à la class qui gère tous les messages entrant pour les trier et les affecter sur l'IHM
}
}
catch (Exception e)
{
Debug.WriteLine("Erreur OnTaskCompleted : " + e);
}
}
Вы можете видеть, что я также передаю объект-значение другому классу для обработки полученного сообщения.Вот метод TriMessage:
public void TriMessage(object data)
{
ExtendedSplash UnlockScreen = new ExtendedSplash(splash, state);
switch (data.ToString())
{
case "Test":
Debug.WriteLine("OK Fonctionne.");
break;
case "start":
Debug.WriteLine("Dévérouillage de l'application");
UnlockScreen.DismissExtendedSplash();
break;
}
}
Когда я получаю стартовое сообщение, я вызываю метод DimissExtendedSplash, чтобы остановить его, но вот код ошибки, который появляется из Visual.Я не знаю, как изменить потоки, чтобы избежать этой проблемы.
Ошибка из Visual:
Erreur OnTaskCompleted : System.Exception: L’application a appelé une interface qui était maintenue en ordre pour un thread différent. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
at Windows.UI.Xaml.Controls.Page..ctor()
at PhonieMartha.ExtendedSplash..ctor(SplashScreen splashscreen, Boolean loadState)
at PhonieMartha.ReceptionMessageLTO.TriMessage(Object data)
at PhonieMartha.SocketConnexionTask.Task_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)