2016-07-20 10 views
1

私はasync/awaitTasksの周りに私の頭を取得しようとしています。私は私のプログラム全体でそれを使うことができるように一つの方法をダウンしようとしています。基本的に私は作業が完了している間に私が表示したい自分自身のバージョンBusyIndicatorを持っています。ここに基本的な例があります。非同期タスクまだブロックUIスレッド

private async void OnPageLoad(object sender, RoutedEventArgs e) 
{ 
    var waitWindow = new PleaseWaitWindow(); 

    waitWindow.Show(); 

    await LoadCompanyContracts(); 

    waitWindow.Close(); 
} 

private async Task LoadCompanyContracts() 
{ 
    await Task.Run(() => 
    { 
     Dispatcher.Invoke(() => 
     { 
      //Work done here 
     }); 
    });  
} 

でもこれらの2つの方法を通じて、まだ回転しないTasksBusyIndicatorを実装しようと、それが表示されますが、実際には、私はUIスレッドがまだブロックされていると考えているように凍結されています。どのようにしてこのコードを修正して、すべてのCPUバインドされた作業がUIスレッドをブロックしないようにすることができますか?

+0

こんにちは、あなたはあなたのLoadCompanyContracts方法 – OrcusZ

+0

@OrcusZこんにちはOrcusZのための空間を使ってみてください - 'await'はvoidを返すメソッドで作業することができないようです。 – CBreeze

+0

あなたは 'Dispatcher.Invoke'を完全に避けるべきです - UIを待っているスレッドをブロックすることに変換します。 (待たされる) 'InvokeAsync'を使用してください。また、スレッドプールタスクを作成してDispatcherに呼び出すだけでは無駄です。 –

答えて

4

を更新するためのタスクと使用ディスパッチャ内部の作業を行い、あなたはまったくDispatcherを使用しないでください。非常に一般的な方法ですが、一般的に悪いことです。

private async Task LoadCompanyContracts() 
{ 
    await Task.Run(() => 
    { 
    //Work done here 
    }); 
    // Update UI if necessary. 
} 
-1

ここに私のコードにいくつかの例のためのソリューションを見た後、あなたは試すことができます:

private async void OnPageLoad(object sender, RoutedEventArgs e) 
    { 
     var waitWindow = new PleaseWaitWindow(); 

     waitWindow.Show(); 

     InitLoadCompanyContracts(); 

     waitWindow.Close(); 
    } 


    private async void InitLoadCompanyContracts(){ 
     await LoadCompanyContracts(); 
    } 


    private async Task LoadCompanyContracts() 
    { 
     await Task.Run(() => 
     { 
      Dispatcher.Invoke(() => 
      { 
       //Work done here 
      }); 
     });  
    } 

私はawaitableメソッドを持っているが、すべての「グラフィックス」のメソッドのうちのためにこれを使用します。私はそれを行うための最善の方法があるかどうかはわかりませんが、私にとってはそれが仕事です。

1

Dispatcher.Invoke()は、ディスパッチャがuiスレッドに関連付けられているため、内部で作業しないでください。唯一の一般的なルールとしてUI

private async Task LoadCompanyContracts() 
    { 
     await Task.Run(() => 
     { 
     /*Work done here 
      * 
      */ 
     Dispatcher.Invoke(() => 
     { 
      //Update UI 
     }); 
     });  
    } 
関連する問題