Лучший способ справиться со сном в обработчиках событий в однопоточном API?

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам