マネージド コードでそのようなことが可能かどうかはわかりません。説明させてください。特定のスレッドが現在プロセス内で実行されていることをその ID で知る必要があります。同じプロセスの別のスレッドからそれを行うことはできますか?
4 に答える
Id とは、マネージド Id を意味すると思います。簡単に言えば、プロセス内のマネージド スレッドを列挙する直接的な方法はありません。別のプロセスからマネージド デバッグ API (MDbg) を使用してターゲット プロセスにアタッチし、デバッガーの観点からすべてのマネージド スレッドを列挙できます。それを行うために別のプロセスを起動できる場合、これがおそらく最も簡単な方法です。同じ工程からやらないといけないのならそれも可能です。ただし、MDbg のソース コードを調べる必要があります。最新の MDbg は、ダンプ ファイルへの添付をサポートしています。ライブ プロセスをサポートするには、独自の ICorDebugDataTarget を実装する必要があります。次に、MDbg を使用してダンプ ファイルにアタッチするのと同じ方法で、同じプロセスからプロセスにアクセスできます。ダンプ ファイルの分析がライブ プロセスの分析と同じではないのと同じように、いくつかの制限があります。
しかし、私が言ったように、ジョブを実行するために短期間のプロセスを生成することが可能であれば、それが最も簡単です。
MDbg のソース コードとサンプルは、ここからダウンロードできます。
マネージドスレッドでこれを行うことはできないと思います。この機能が本当に必要な場合は、明示的に作成されたスレッドを使用し、独自のスレッド マネージャーを作成して維持することで、目的を達成できる場合があります。新しいスレッドを起動するたびに、ID を割り当てて辞書に保存できます。そうすれば、必要な情報を取得するために ID でスレッドを簡単に検索できます。スレッドの実行が完了したら、不要になったスレッドを辞書から削除できます。
public class ThreadManager
{
private int threadID { get; set; }
public Dictionary<int, Thread> ThreadList { get; set; }
public ThreadManager()
{
this.ThreadList = new Dictionary<int, Thread>();
}
public void LaunchThread(Action<string> SomeProcess, string s)
{
Thread thread = new Thread(() => SomeProcess(s));
int id = threadID++;
thread.Name = id.ToString();
ThreadList.Add(id, thread);
thread.Start();
}
public void KillThread()
{
ThreadList.Remove(Int32.Parse(Thread.CurrentThread.Name));
}
}
フォーラムでこれを見つけました:
int threadId = [something];
Process currentProcess = Process.GetCurrentProcess();
foreach( Thread thread in currentProcess.Threads )
{
if( thread.ManagedThreadId.Equals( threadId ) )
{
// do something
}
}
自分で試したことはありません。