【发布时间】:2019-04-29 08:45:15
【问题描述】:
我正在创建一个使用两个线程的应用程序,一个用于整个 UI,另一个用于检索串行链接接收到的数据的后台任务。
当启动我的应用程序时,会显示一个扩展的初始屏幕,解锁它并转到主页,应用程序需要来自服务器“启动”的消息。
当我收到一条消息时,我的后台任务的 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 中出现的错误代码。我不知道如何改变线程来避免这个问题。
视觉错误:
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)
【问题讨论】:
-
您没有显示相关代码。通常 bgw 完成事件应该在 UI 线程上运行,但仅当 RunWorkerAsync 也从那里启动时。你的线程可能太多了。
标签: c# visual-studio xaml uwp