Альтернативы для WaitHandle.WaitAll на Windows Phone? - PullRequest
1 голос
/ 09 февраля 2012

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

Вот мой сценарий: я запускаю несколько http-запросов и хочу дождаться, пока все они вернутся, прежде чем я смогу продолжить.Я хочу убедиться, что если пользователю придется ждать более X секунд (всего), чтобы все эти запросы вернулись, операция должна быть прервана.

1 Ответ

1 голос
/ 09 февраля 2012

Вы можете попробовать с глобальной блокировкой.

Начать новый поток и использовать блокировку для блокировки потока вызывающего абонента с требуемым значением времени ожидания.

В новом потокезацикливание на ручках и ожидание вызова на каждом.Когда цикл завершен, сообщите о блокировке.

Что-то вроде:

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();
    }
}
...