2017-09-09 4 views
0

私は次のコードを持っている:長時間実行しているプロセスを呼び出す前に、ビューモデルのプロパティを更新するにはどうすればよいですか?

Public Async Sub ExecuteMyCommand 
    ShowProgressBar=True 
    Await Task.Run(Sub() CallLongRunningProcess) 
    ShowProgressBar=False 
End Sub 

問題:長時間実行プロセスは、このコードを開始する前に、実際に表示するようにUIにプログレスバーを取得するには

Public Sub ExecuteMyCommand 
    ShowProgressBar=True 
    CallLongRunningProcess 
    ShowProgressBar=False 
End Sub 

はに書き換えなければなりません:

長時間実行されるプロセスでは、WPF UserControlを作成する方法があります。これらはSTAスレッドで作成する必要があります。私はこれを行う方法を見つけましたが、ユーザーコントロールが非UIスレッドによって所有されているため、InvalidOperationExceptionが発生します。ですから、私は、UIスレッド上で長時間実行されているプロセスを呼び出す前にShowProgressBarプロパティを更新する方法を探しています(ええと、醜い、私が知っている)。

+0

「UIスレッドで長時間実行されているプロセスを呼び出す前にShowProgressBarプロパティを更新する方法を探しています」という意味は何ですか? – Sybren

+1

@Sybren ShowProgressBarプロパティは、ビューのProgressBar.Visibilityプロパティにバインドされています。ごめんなさい。 – Dabblernl

答えて

0

Dispatcher.Invokeを試しましたか?タスクはUIスレッドに保持されます。 もちろん、代理人にShowProgressBar=Falseを移動する必要があります。

Public Sub ExecuteMyCommand 
    ShowProgressBar=True 
    Me.Dispatcher.Invoke(DispatcherPriority.Normal, New LongRunningProcessDelegate()) 
End Sub 

それが行われたときに、私はまた、コンピューティングタスクのロジックを変更する別のUIは、すなわち、タスクは、UIスレッドにコールバックべきだろう、およびUI要素の変更は、コールバックに委ねられることになります。

+0

非同期dbクエリーが終了した後にUIをリフレッシュしなければならなかったときにうまくいきました。私はあなたのケースで何が違うのだろうかと思います。私はC#をやっている。ヘビーコンピューティングはバックグラウンドワーカーによって行われました。私は決してUIスレッドに負担をかけませんでした。 – yacc

+1

謝罪します。あなたのソリューションは私のために働く。私はそれを少し前とは違ってやったに違いない。 – Dabblernl

関連する問題