通常、無効な入力がメソッドに渡されたとき、またはオブジェクトが無効な状態に入ろうとしているときに例外をスローします。次の例を考えてみましょう
private void SomeMethod(string value)
{
if(value == null)
throw new ArgumentNullException("value");
//Method logic goes here
}
上記の例では、 throws をスローする throw ステートメントを挿入しましたArgumentNullException
。私の質問は、ランタイムがどのように をスローするかThreadAbortException
です。明らかにthrow
、すべてのメソッドでステートメントを使用することはできません。ランタイムでさえThreadAbortException
、カスタム メソッドをスローすることができます。
彼らはどうやってそれをするのだろうと思っていましたか?舞台裏で何が起こっているのか興味があったので、リフレクターを開いて開いたThread.Abort
ところ、これに行き着きました
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private extern void AbortInternal();//Implemented in CLR
それから私はググって、このHow does ThreadAbortException really workを見つけました。このリンクは、ランタイムがQueueUserAPC
関数を介して APC を投稿することを示しており、それが彼らがトリックを行う方法です。QueueUserAPC
いくつかのコードでそれが可能かどうかを確認しようとしただけの方法を知りませんでした。次のコードは私の試みを示しています。
[DllImport("kernel32.dll")]
static extern uint QueueUserAPC(ApcDelegate pfnAPC, IntPtr hThread, UIntPtr dwData);
delegate void ApcDelegate(UIntPtr dwParam);
Thread t = new Thread(Threadproc);
t.Start();
//wait for thread to start
uint result = QueueUserAPC(APC, new IntPtr(nativeId), (UIntPtr)0);//returns zero(fails)
int error = Marshal.GetLastWin32Error();// error also zero
private static void APC(UIntPtr data)
{
Console.WriteLine("Callback invoked");
}
private static void Threadproc()
{
//some infinite loop with a sleep
}
何か間違ったことをしている場合は、私を許してください、私はそれを行う方法がわかりません。もう一度質問に戻りますが、これについての知識を持っている人、または CLR チームの一部が内部でどのように機能するかを説明できますか? APC
トリックランタイムがここで間違っていることに従うのですか?