2017-11-03 25 views
3

にメソッドの結果を呼び出す:は、私は、次について疑問に思ってメインスレッド

私はContainerMethodという名前のメソッドという名前の監視可能なコレクションを持っています。

メインスレッドでは、Methodの戻り値をContainerに追加します。

次のコードは、別のスレッドで実行されますので、私はエラーを持っていないようにアプリ現在のスレッドにContainer.Addを起動している:私は、次の

App.Current.Dispatcher.Invoke(() => { 
    Container.Add((MyObject)Method()) 
}); 
を行うかどう

object obj = Method() 
App.Current.Dispatcher.Invoke(() => { 
    Container.Add((MyObject)obj) 
}); 

私の質問は

メソッド(長時間実行中のメソッド)は、現在のアプリケーションのスレッドで実行されますが、これはUIを渡すため正しくないため、定義しないでContainerに追加するメソッドの戻り値のみを呼び出すことができますオブ最初の例のようにject?あなたはしかし、バックグラウンドスレッドを取り除くこと

Dispatcher.Invoke(new Action<MyObject>(o => Container.Add(o)), (MyObject)Method()); 

Taskのメソッドを呼び出します。

答えて

4

あなたはthis Invoke overloadを使用することができます。したがって、あなたはDispatcher.Invoke呼び出す必要がないようになります。これは.NET 4.5かのどちらかが必要であることかかわら

App.Current.Dispatcher.Invoke(async() => 
{ 
    Container.Add(await Task.Run(() => Method())); 
}); 

注:また@Clemensの提案に、あなたはTask-based Asynchronous Pattern (TAP)を使用することができます

Container.Add(await Task.Run(() => (MyObject)Method())); 
+0

2番目のオプションでは、呼び出しメソッドを 'async'とマークする必要はありませんか? – Grx70

+0

@ Grx70もちろん、いつものように。 – Clemens

+0

最初の例を使用すると、Methodは同じスレッドで実行されますが、結果はUIスレッドにのみ呼び出されますか? – berthos

3

を後で、または.NET 4Microsoft.Bcl.Async NuGetパッケージ。

+2

バックグラウンドスレッドが存在しないため、Dispatcher.Invokeをもう呼び出す必要はありません。 – Clemens

+0

@ClemensこのコードがUIスレッド以外のスレッドで実行されている場合(あなたの質問から判断してください)私はしかし、 'Method'はさらに別のスレッドで実行されることに同意します。単純に変数を取り除くという点では最良の解決策ではありません。 – Grx70

+2

UIスレッド以外のスレッドがあった場合、タスクでメソッドを呼び出す必要はありません。あなたはすでに背景のスレッドに入っています。 – Clemens