Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Ожидание завершения работы потока




 

Рассмотренный нами случай был наиболее простым. Однако предположим, что наш метод, который должен выполняться в отдельном потоке, возвращает некоторый результат:

private static long GetDivider(long checkNumber){…}

Очевидно, нам необходимо знать две вещи:

· Когда поток завершил работу?

· Как получить результат, возвращенный функцией, выполнявшейся в этом потоке?

Рассмотрим решение первой задачи. Как и в предыдущем случае необходимо создать делегат, соответствующий нашему методу, создать его экземпляр и вызвать метод BeginInvoke.

private delegate long GetDividerDelegate(long checkNumber);

GetDividerDelegate dlgt = new GetDividerDelegate(GetDivider);

Однако теперь нас интересует объект, возвращаемый методом BeginInvoke:

IAsyncResult res = dlgt.BeginInvoke(1000000021, null, null);

Первый способ дождаться завершения созданного нами потока – проверять свойство IsCompleted объекта IAsyncResult:

while (!res.IsCompleted)

{

continue;

}

 

Внутри данного цикла вы можете производить какую-либо работу в основном потоке.

Второй подход заключается в использовании объекта, возвращаемого свойством AsyncWaitHandle объекта IAsyncResult:

res.AsyncWaitHandle.WaitOne();

Более подробно об объектах WaitHandle мы будет говорить в разделе, посвященном синхронизации потоков. Сейчас же важно то, что вызов метода WaitOne этого объекта позволяет нам дождаться завершения нашего потока. Однако знайте, что вызов этого метода блокирует вызвавший его поток до тех пор, пока не будет завершен ваш поток.

В связи с этим наверно самым удобным способом получения уведомления о том, что ваш поток завершился, является делегат обратного вызова. Этот делегат передается одним из параметров метода BeginInvoke:

dlgt.BeginInvoke(1000000021, new AsyncCallback(GetDividerFinished), null);

Сигнатура этого метода:

private static void GetDividerFinished(IAsyncResult res){…}

Как видно, ему передается такой же объект IAsyncResult, что возвращался при вызове метода BeginInvoke. При использовании такого подхода основной поток не будет заблокирован, а в момент завершения вашего потока будет вызван метод GetDividerFinished.

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных