XTThreadPoolクラスに何が含まれているのかわからない場合は少し注意が必要ですが、推測することはできます...
チャンスは、この最初のビット...
taskWrapper = XTThreadPool.DEFAULT_POOL.Run((System.Threading.ThreadStart)delegate()
{
//Remote procedure execution and result processing code.
//Some vars set in here are used after the Join() below.
}, true, true);
...非同期で実行されるスレッドを開始し、コメントを入力したセクションで指定されたメソッドを渡します。これはおそらく、メソッドをコンストラクターにデリゲートとして渡すスレッドのインスタンスを作成しnewThread.Start()
、アプリケーションのスレッドプール内の新しいスレッドで実行を開始するを呼び出すことによって実現されます。次に、スレッド参照を使用して、そのスレッドのステータスをチェックし、スレッドが完了したかどうかを確認できます。これは、おそらくこのセクションで行うことです。
while (taskWrapper.Status == XTThreadPool.Task.STATUS.None)
{
System.Threading.Thread.Sleep(10);
}
これは私には少し奇妙に思えます。スレッドプールによって開始されたスレッドではなく、現在のスレッドSystem.Threading.Thread
にアクセスします。Sleepメソッドは単に「何もしない」ことを意味します。したがって、現在のスレッドは、taskWrapperインスタンスによって開始されたスレッドがNone以外のステータスになるのを待機しています。これは、taskWrapperが何をしているのか本当にわからないため、困難になるところです。
実際には、スレッドの実行が完了するのを待っているだけである可能性がありますが、上記のwhileループの代わりに作業を行うこともできるため、別のスレッドを使用しても意味がありません。
そしてこれ:
taskWrapper.Join();
上記の行は、taskWrapperの実装に依存すると言っているように、実際には何でもできます。しかし、名前に基づいて、Thread.Joinメソッドを使用していると思います。これにより、基本的に、呼び出し元のスレッド(このスレッド)は、呼び出されたスレッド(taskWrapper)が完了するまで待機します。ただし、taskWrapper自体は実際にはスレッドではなく(上記のStatusプロパティの値のチェックに基づく)、スレッドの単なるラッパーである可能性が高くなります。
私はこれを正直に完全に推測しました、それは本当に何かをしている可能性があります。XTThreadPoolクラスのコードと、そのインスタンスであるDEFAULT_POOLがないと、何が起こっているのかを確実に知ることは不可能になります。
最初の検査で、コードが上記で推測したことを実行している場合、作業を実行するための別のスレッドを持っている意味はなく、whileループを持っている意味もありません!全体を、Runの呼び出し内のメソッドにあるものに置き換えることができます。