2017-06-09 1 views
0

Je suis en train de définir une propriété Liste ViewModel à partir d'une méthode async, mais cela se termine par l'erreur suivante:Définition d'une interface utilisateur ViewModel Propriété d'une méthode Async

{"The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))"}

L'erreur est assez claire. Ce qui n'est pas clair pour moi est la meilleure approche pour surmonter ce problème et définir avec succès la propriété qui à son tour met à jour l'interface utilisateur.

La tentative suivante se termine par référence d'objet non définie à une instance d'un objet erreur au point d'initialisation du répartiteur:

private async Task DoSomething() 
    { 
     DispatcherHelper.Initialize(); 
     DispatcherHelper.CheckBeginInvokeOnUI(
     () => 
      { 
      ViewModelProperty = SomeResult; 
      }); 
    } 

Quelle est la meilleure approche pour résoudre ce problème?

Mise à jour:

Je fini par l'initialisation de la DispatcherHelper globalement dans la méthode App.xaml.cs OnLaunched.

+0

Puisque vous avez la méthode marquée comme async, est-il possible que le thread principal poursuivi et est en train de modifier autre chose à en même temps et vous voyez le résultat d'une condition de course? – PhilChuang

+0

Je ne vois aucune raison qu'une méthode statique comme 'DispatcherHelper.Initialize()' devrait lancer 'NullReferenceException'. Votre question manque clairement de détails importants. Mais voyez la copie marquée pour des conseils étendus concernant comment diagnostiquer et fixer 'NullReferenceException'. Si vous ne parvenez pas à résoudre votre problème à l'aide de ce conseil, postez une nouvelle question dans laquelle vous fournissez un bon [mcve] qui reproduit fidèlement le problème, et dans lequel vous avez expliqué en détail ce que vous avez fait jusqu'à présent pour résoudre le problème. problème et ce _specifically_ vous êtes incapable de comprendre. –

+4

@PeterDuniho, S'il vous plaît arrêter! abuser du pouvoir/privilège qui vous a été donné par StackOverflow. Envoyer des utilisateurs à des sujets génériques/longs et marquer des posts comme des doublons est une action déplacée. Julien a répondu avec grâce à la question ci-dessous. Si vous avez une meilleure approche, vous pouvez l'ajouter! – usefulBee

Répondre

2

Il semble que vous appeliez DispatcherHelper.Initialize() dans un fil d'arrière-plan. Ici, il n'a pas accès à un objet Dispatcher.

Vous devez initialiser le thread d'interface utilisateur, comme indiqué dans le documentation:

Initialize. This method should be called once on the UI thread to ensure that the UIDispatcher property is initialized.

+0

Excellent! L'initialisation de DispatcherHelper à partir du View Code Behind ou du ViewModel tant qu'il est effectué en dehors de la fonction async a résolu le problème. – usefulBee