2016-06-25 10 views
3
public bool Remove() 
{ 
    var itemsToRemove = activeQueue.Where(x => x.Value.CanRemove()).ToArray(); 
    foreach(var item in itemsToRemove) 
     activeQueue.Remove(item.Key); 

    return passiveQueue.IsEmpty && activeQueue.Count == 0; 
} 

Removeメソッドを待ちたいと思っています - public async bool Remove()。したがって、ブロックするのはCanRemoveで、現在はTask<bool>です。しかし、私はそれを作る方法がわかりませんawaitこのラムダ式をasync/awaitに変換する方法は?

UPD:

public Task<bool> CanRemove() 
{ 
    return Task.Run(() => { 
     ... 
     return false; 
    }); 
} 
+0

「今はタスクを戻しているCanRemoveだけです」とはどういう意味ですか? CanRemoveを表示できますか?この方法にはIOが関係していますか? –

+0

私は、呼び出しスレッドをブロックする可能性のある場所のみを意味します。同期API呼び出しを使用しているライブラリー呼び出しがいくつか含まれています。 – Pablo

+0

あなたは何を削除しようとしていますか?非同期呼び出しは、主にI/O呼び出し(データベースまたはファイル操作を考える)に使用する必要があります。 –

答えて

0

一つの方法は、任意の実際の非同期の作業(例えばIO)、およびあなたの心配をしないRemoveのでTask.Run()

public async Task<bool> Remove() 
    { 
     await Task.Run(() => { 
      var itemsToRemove = activeQueue.Where(x => x.Value.CanRemove()).ToArray(); 
      foreach(var item in itemsToRemove) 
       activeQueue.Remove(item.Key); 
     }); 

     return passiveQueue.IsEmpty && activeQueue.Count == 0; 
    } 
+0

'CanRemove'はすでに"タスキング "されているので、私には奇妙に見えます。 – Pablo

1

を使用することですが、あなたがいないということですUIスレッドをブロックしたい場合は、同期させておくことをお勧めします(メソッド内でTask.Runasyncawaitは使用しないでください)。UI内のUIスレッドをブロックしないようにスレッドプールスレッドのみを使用しますイベントハンドラ。ここに例があります:

private async void button_Clicked(object sender, EventArgs e) 
{ 
    var result = await Task.Run(() => Remove()); 
    //... 
} 
0

これは動作するはずです。

public async Task<bool> Remove() 
    { 
     for (int i = activeQueue.Count; i>=0; i++) 
     { 
      var aq = activeQueue[i]; 
      var canRemove = await aq.Value.CanRemove(); 
      if (canRemove) 
      { 
       activeQueue.RemoveAt(i); 
      }      
     }   

     return passiveQueue.IsEmpty && activeQueue.Count == 0; 
    } 
+0

つまり、ラムダ式にasync/awaitを埋め込むことはできません。 – Pablo

+0

可能です(私はこれを読むことをお勧めします:http://blogs.msdn.com/b/pfxteam/archive/2012/02/08/10265476.aspx)。 –

関連する問題