Как решить проблему выполнения задачи с потоком? - PullRequest
0 голосов
/ 29 апреля 2019

Я создаю приложение, которое использует два потока, один для всего пользовательского интерфейса, а другой - для фоновой задачи, которая извлекает данные, полученные по последовательной связи.

При запуске моего приложения отображается расширенный заставочный экран, чтобы разблокировать его и перейти на главную страницу, приложение ожидает от сервера сообщение «Пуск».

Когда я получаю сообщение, метод 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)

1 Ответ

1 голос
/ 29 апреля 2019

Это происходит потому, что вы пытаетесь изменить пользовательский интерфейс из другого потока, который не является потоком пользовательского интерфейса.

Вы вызываете метод TriMessage внутри фонового потока, который пытается изменить пользовательский интерфейс внутриэто с помощью этого метода:

UnlockScreen.DismissExtendedSplash();

Вы не можете обновить пользовательский интерфейс из фонового потока, но вы можете отправить ему сообщение с помощью CoreDispatcher.RunAsync, чтобы запустить там код.

Взято из Сохранить отзывчивость темы пользовательского интерфейса

Если вы хотите понять, как работает диспетчер, вот хороший пост об этом: Диспетчер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...