0

WinAPIがAPCと呼ばれるものを提供していたことをぼんやりと思い出します。これにより、スレッドに関数を実行するように指示することができ、実行する時間が見つかるとすぐに実行されます。スレッドはシグナルを待つ必要はありませんが、カーネルはそのAPCキューを維持し、キュー内のアイテムを実行するようにスレッドに指示しました。

.NETでこれがどのように行われるかを調査しましたが、これまでのところ、これを行う方法は見つかりませんでした。BeginInvokeについて知っていますが、これはUIコントロールのコンテキストにのみ適用できると思いますか?

.NET環境でこれを行うにはどうすればよいですか?

ありがとうございました!

4

2 に答える 2

3

これは、APC が I/O 完了コールバックに使用される非常に特殊なケースで、.NET でいくらか公開されます。これは、APC の非常に一般的な用途です。APC と同様に非常に低レベルです。コア メソッドは ThreadPool.BindHandle() であり、コールバックがスレッドプール スレッドでマネージド コードを実行できるように配管を設定します。ただし、重複した I/O を開始するための呼び出しを行うことはできません。ピンボークするのはあなた次第です。それ以外の場合、これは、I/O を実行するさまざまなクラスとその BeginXxxx() メソッド (FileStream、PipeStream、Socket など) によって既に適切にラップされています。

独自の APC に必要な次のことは、スレッドをアラート可能な待機状態にすることです。これは、bAlertable 引数に TRUE 値を指定した WaitForSingleObjectEx() と同等です。これは CLR によって大きくラップされており、マネージド スレッドを安全に中止できるかどうかが非常に重要になるため、待機のアラート可能状態に大きな利害関係があります。ご存知のように、Thread.Join() や Thread.Sleep() などのメソッドを含め、マネージド コードで呼び出すすべての待機はアラート可能です。WaitHandle.WaitXxx オーバーロードの「exitContext」という名前の bool 引数を無視します。これは別のことを意味します。

于 2012-08-11T15:24:17.237 に答える
1

スレッドは、一連の API でブロックされている場合にのみ APC を実行できます。このセットには、GetMessage() と、'Alertable' フラグが設定されている場合の 'BlahEx' 呼び出し (例: SleepEx) が含まれます。スレッドは実際にシグナルを待機する必要があります。スレッドは、スレッド間通信に関与しない限り、APC などを実行するために「迂回」することはできません。

.NET にマネージ SleepEx() などがあるかどうかはわかりませんが、アンマネージ コードに頼ることなく、マネージ スレッドが何らかの方法で APC を実行できると確信しています (.NET の皆さん、助けてください!)。

于 2012-08-11T10:28:44.260 に答える