2016-12-20 149 views
3

5秒ごとに呼び出す関数が含まれているC#UWPアプリケーションがあります。 ボタンから呼び出されたときに関数が正常に動作し、5秒ごとにデバッグコンソールへのTimer書き込みが正常に実行されます....私がTimerから関数を呼び出すと、すべてのheckが緩んでいます。C#UWPアプリケーションが別のスレッド用にマーシャリングされたインターフェイスを呼び出しました

System.Exceptionがユーザーコード で処理されていませんでした。HResult = -2147417842 メッセージ=アプリケーションが別のスレッド用にマーシャリングされたインターフェイスを呼び出しました。 (HRESULTからの例外:0x8001010E(RPC_E_WRONG_THREAD))

+0

どのような種類のタイマーを使用していますか? – CodingYoshi

答えて

0

Timer(おそらくSystem.Threading)を使用している可能性があります。そのタイマーのイベントは通常のGUIイベントのように扱われず、そのタイマーによって呼び出されたメソッドからGUIアイテムにアクセスする場合、そのスレッドはGUIアイテムの所有者ではないため、問題が発生します。

TimerSystem.Windows.Formsから使用してください。そのタイマーはあなたのGUI項目にアクセスできます。

+0

原則は正しいですが、UWPアプリケーションのSystem.Windows.Formsはそう思わないでしょう。 – spender

+0

@spenderあなたはそれがUWPで利用できないことを意味しますか? – CodingYoshi

5

あなたの関数は、アプリケーションのUIに触れていると仮定します。 UIに触れるものは、UIのディスパッチャスレッド上で実行する必要があります(ほとんどのアプリケーションは、複数のウィンドウアプリケーションに入るまで、1つしかありません)。

Windows.UI.Xamlを使用できます。 DispatcherTimerを使用して、ディスパッチャスレッドでタイマーを実行します。

ワーカースレッドでコードを実行し、ディスパッチャースレッドのUIに触れる必要がある場合は、Dispatcherを呼び出すことができます。 RunAsyncを呼び出して、ディスパッチャスレッドにコールバックをマーシャリングします。

ディスパッチャは、通常、ウィンドウからWindow.Dispatcherを経由して見つけることができます。

var ignored = Window.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
{ 
    // Do something on the dispatcher thread 
}); 
関連する問題