2

スレッドセーフではないイベントAPIを使用しています。wait()が呼び出され、その呼び出しからイベントハンドラーがディスパッチされます。イベントハンドラー内で、しばらくの間「スリープ」できるようにしたいと思います。現在、関数を後で呼び出すようにスケジュールするスケジューラーがあり、Scheduler.Sleeper(some_ienumerator)をイベントハンドラーとして使用できるようにするちょっとしたハックがあるので、一種のスリープとしてタイムスパンを生成できます。より良い解決策はありますか?C#にRubyスタイルのファイバーがある場合、スケジューラーに呼び出すことができるSleep()関数を持たせることができ、スリープ機能は、ハンドラーから直接ではなく、イベントハンドラーによって呼び出される関数に含めることができます。使いやすいファイバーがないので、他にできることはありますか?

明確化のための編集:wait(n)ここでnは時間の長さであり、その待機呼び出し中に、APIはイベントハンドラーを呼び出します。これらのハンドラーの一部で「スリープ」したい理由は、これがゲーム用であり、何かをクリックした後、オブジェクトがたとえば1秒間光る場合があるためです。

4

1 に答える 1

0

あなたの質問はあまり明確ではありません。問題は、「待っている」間に何をしたいのかということです。たとえば、WinForms GUIアプリケーションについて話している場合は、待機中に他のイベントを処理する必要があります(これはApplication.DoEventsメソッドを使用して実行できます)。したがって、同様のソリューションを使用できますか?

軽量の協調マルチスレッド(おそらくRubyファイバーに似ています)は、イテレーター(yield return)キーワードを使用してC#でシミュレートできます。.NETでこのようなことを行うためのはるかに優れた方法は、F#を使用することです。この場合、非同期ワークフローを使用して、この種のことをよりエレガントに行うことができます。これは、ブロックせずにイベントの発生を「待機」できるシングルスレッドGUIの作成を示す記事です。

私が言ったように、これをC#で使用してシミュレートできますyield return。これが私の試みです:

に基づく別のアプローチyield returnは、並行性と調整のランタイムです。これは少し複雑ですが、主にC#用に設計されています。

于 2010-03-10T02:46:58.060 に答える