2012-02-09 27 views
1

Windows Phone(7.1)で実行すると、WaitHandle.WaitAllはNotSupportedExceptionをスローします。この方法の代替手段はありますか?Windows Phone上のWaitHandle.WaitAllの代替手段はありますか?

ここに私のシナリオがあります:私は、httpのWebリクエストの束を発射しており、私は彼らがすべて私が続行する前に戻ってくるのを待っています。私は、ユーザーがこれらの要求のすべてが戻るためにX秒以上(合計)を待たなければならない場合、操作を中止する必要があることを確認したい。

答えて

1

グローバルロックで試すことができます。

新しいスレッドを開始し、ロックを使用して呼び出し元のスレッドをブロックし、必要なタイムアウト値を設定します。

新しいスレッドでは、ハンドルをループし、それぞれを待機します。ループが完了したら、ロックを通知します。

のような何か:

private WaitHandle[] handles; 

private void MainMethod() 
{ 
    // Start a bunch of requests and store the waithandles in the this.handles array 
    // ... 

    var mutex = new ManualResetEvent(false); 

    var waitingThread = new Thread(this.WaitLoop); 
    waitingThread.Start(mutex); 

    mutex.WaitOne(2000); // Wait with timeout 
} 

private void WaitLoop(object state) 
{ 
    var mutex = (ManualResetEvent)state; 

    for (int i = 0; i < handles.Length; i++) 
    { 
     handles[i].WaitOne(); 
    } 

    mutex.Set(); 
} 

別のバージョン共有ロックの代わりに使用してThread.Join:

private void MainMethod() 
{ 
    WaitHandle[] handles; 

    // Start a bunch of requests and store the waithandles in the handles array 
    // ... 

    var waitingThread = new Thread(this.WaitLoop); 
    waitingThread.Start(handles); 

    waitingThread.Join(2000); // Wait with timeout 
} 

private void WaitLoop(object state) 
{ 
    var handles = (WaitHandle[])state; 

    for (int i = 0; i < handles.Length; i++) 
    { 
     handles[i].WaitOne(); 
    } 
}