簡體   English   中英

處理單線程API中的事件處理程序中的休眠的最佳方法?

[英]Best way to deal with sleeping in event handlers in a single-threaded API?

我正在使用非線程安全事件API。 調用wait() ,並從該調用中調度事件處理程序。 我希望能夠在事件處理程序中“休眠”一段時間。 當前,我有一個計划程序,該函數計划以后要調用的函數,並且有一點讓我使用Scheduler.Sleeper(some_ienumerator)作為事件處理程序的技巧,因此我可以將時間跨度作為一種睡眠。 有更好的解決方案嗎? 如果C#具有Ruby樣式的Fibers,我將能夠使調度程序具有一個可以調用的Sleep()函數,並且該睡眠對象可以位於事件處理程序而非直接處理程序調用的函數中。 鑒於缺乏易於使用的光纖,我還能做些其他事情嗎?

編輯說明:我調用wait(n) ,其中n是一個時間量,在該等待調用中,API調用了事件處理程序。 我想在其中一些處理程序中“休眠”的原因是,這是針對游戲的,在該游戲中,單擊某物后,某個對象可能會發光一秒鍾。

您的問題不是很清楚。 問題是您在“等待”期間想做什么? 例如,如果您談論的是WinForms GUI應用程序,那么您將希望在等待時處理其他事件(可以使用Application.DoEvents方法完成),因此也許可以使用類似的解決方案?

輕量級的協作多線程(可能類似於Ruby光纖)可以在C#中使用迭代器( yield return )關鍵字進行模擬。 在.NET中執行此類操作的更好方法是使用F#,您可以在其中使用異步工作流更優雅地執行此類操作。 這是一篇演示如何編寫單線程GUI的文章,您可以在其中“等待”事件的發生而不會阻塞:

如我所說,您可以使用yield return在C#中對此進行仿真。 這是我的嘗試:

基於yield return另一種方法是並發和協調運行時 ,它稍微復雜一些,但主要是為C#設計的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM