すべてのウィンドウアプリケーションには、アプリケーションのビジュアル表現を扱うための専用のスレッドが1つあります。このスレッドはthe UI threadです。コードがウィンドウイベント(Loadedイベントやユーザーがボタンをクリックするなど)に反応して実行されるとき、このUIスレッドで実行されます。あなたのコードが実行されている間、あなたの仕事を実行するUIスレッドが占有されており、ウィンドウの視覚的表現を更新することはできません。極端な場合(作業が完了するまでに時間がかかります)、ウィンドウはロックされた状態で表示されます。
UIスレッドを使用して長時間実行する作業を行っている場合は、正しく実行していません。 async-awaitを使用するか、またはをバックグラウンドスレッドで実行するためにTask.Run()
を使用するか、を使用する必要があります。
LongProcedure()
がIOバインド(どこかからデータを待つような場合)の場合は、async-awaitを使用する必要があります。それはCPUバウンド(データ処理/計算のロット)である場合は、使用する必要がありますTask.Run()
非同期のawait:
public async Task LongProcedure()
{
IsBusy = true;
await GetDataFromSomewhereAsync();
IsBusy = false;
}
public async void CallingMethod()
{
......
await LongProcedure();
}
Task.Run:
public void LongProcedure()
{
IsBusy = true;
... // long running code here
IsBusy = false;
}
public async void CallingMethod()
{
......
await Task.Run((Action) LongProcedure);
}
ことに注意してくださいバックグラウンドスレッドからUIを直接更新することはできません。通常は、マーシャルのUIコードを更新する必要があります。これにはさまざまな方法があり、使用するWindowsアプリケーションの種類(windows forms、WPFなど)によって異なります。
出典
2016-11-03 02:35:37
Jai
同じスレッドで長期実行タスクを実行していますか? – XAMlMAX
はい、私はそれを簡単に保つことを望んでいました。プロセスには5〜10秒かかり、実行中は何もできません。私は何かが起こっていることをユーザーに知らせるために待機カーソルを表示したかったのです。 – Pedler
@Pedler残念ながら、画面を更新するには同じスレッドが必要です。それは他のものを実行しているため、画面を更新するために使用することはできません。 – Aron