2012-02-09 2 views
1

WaitHandle.WaitAll выдает исключение NotSupportedException при его выполнении на Windows Phone (7.1). Есть ли альтернатива этому методу?Альтернативы WaitHandle.WaitAll на Windows Phone?

Вот мой сценарий: я увольняю кучу http-запросов, и я хочу дождаться, пока все они вернутся, прежде чем я смогу продолжить. Я хочу убедиться, что если пользователю придется ждать больше, чем 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(); 
    } 
}