Лучший способ справиться со сном в обработчиках событий в однопоточном API? - PullRequest
2 голосов
/ 10 марта 2010

Я использую не-поточный API-интерфейс событий. wait() вызывается, и из этого вызова отправляются обработчики событий. Я хочу иметь возможность в обработчике событий "спать" в течение некоторого времени. В настоящее время у меня есть планировщик, который планирует функции, которые будут вызываться позднее, и немного хакер, который позволяет мне использовать Scheduler.Sleeper (some_ienumerator) в качестве обработчика событий, так что я могу выдавать временные интервалы как своего рода сон. Есть ли лучшее решение? Если бы C # имел Fibers в стиле Ruby, я мог бы сделать так, чтобы планировщик имел функцию Sleep (), которую я мог вызывать, и спящий компонент мог бы быть в функции, вызываемой обработчиком события, а не непосредственно обработчиком. Учитывая отсутствие удобных в использовании волокон, могу ли я что-нибудь еще сделать?

РЕДАКТИРОВАТЬ ДЛЯ УТОЧНЕНИЯ: Я звоню wait(n), где n - количество времени, и во время этого ожидания API вызывает обработчики событий. Причина, по которой я хочу «спать» в некоторых из этих обработчиков, заключается в том, что это для игры, где после нажатия на что-либо объект может, например, светиться в течение секунды.

1 Ответ

0 голосов
/ 10 марта 2010

Ваш вопрос не очень понятен. Вопрос в том, что вы хотите делать, пока «ждете»? Например, если вы говорили о приложениях с графическим интерфейсом WinForms, то вы хотели бы обрабатывать другие события во время ожидания (что можно сделать с помощью метода Application.DoEvents), поэтому, возможно, вы могли бы использовать подобное решение?

Легкая кооперативная многопоточность (вероятно, похожая на волокна Ruby) может быть смоделирована в C # с использованием итераторов (ключевое слово yield return). Гораздо лучший способ сделать что-то подобное в .NET - это использовать F #, где вы можете делать такие вещи более элегантно, используя асинхронные рабочие процессы . Вот статья, которая демонстрирует написание однопоточного графического интерфейса, где вы можете «ждать» возникновения события без блокировки:

Как я уже сказал, вы можете смоделировать это в C #, используя yield return. Вот моя попытка:

Другим подходом, основанным на yield return, является среда выполнения параллелизма и координации , которая немного сложнее, но была разработана в первую очередь для C #.

...