0

全て

私は、コンピューターのプロセスでスレッド ID でスレッドを検索するための小さなコードに取り組んでいました。

私のコードはすべて以下のようになります。レビューにご協力ください。:)

    using System.Diagnostics;

    public class NKDiagnostics
    {
        private Process[] m_arrSysProcesses;

        private void Init()
        {
            m_arrSysProcesses = Process.GetProcesses(".");
        }
        public static ProcessThread[] GetProcessThreads(int nProcID)
        {
            try
            {
                Process proc = Process.GetProcessById(nProcID);
                ProcessThread[] threads = new ProcessThread[proc.Threads.Count];
                proc.Threads.CopyTo(threads, 0);
                return threads;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return null;
            }
        }
    }

別のクラスでは、次の名前の関数を実行するスレッドを割り当てますDoNothing

    ThreadPool.QueueUserWorkItem((t) => Utility.DoNothing((TimeSpan)t), 
TimeSpan.FromMinutes(1));

関数DoNothingコードは

public class Utility
    {
        public static void DoNothing(TimeSpan timeout, TextBox txtThreadId)
        {
            TimeoutHelper helper = new TimeoutHelper(timeout);
            while (true)
            {
                Thread.Sleep(1000 * 5);
                if (helper.RemainingTime() <= TimeSpan.Zero)
                {
                    MessageBox.Show("This thread's work is finished.");
                    break;
                }
                else
                {

                    if (Thread.CurrentThread.IsThreadPoolThread)
                    {
                        MessageBox.show( Thread.CurrentThread.ManagedThreadId.ToString());
                    }

                }
            }
        }
}

私の問題はThread.CurrentThread.ManagedThreadIdショー10です。すべてのプロセスで検索しました。しかし、見つかりませんでした。

ProcessThread[] m_Threads = NKDiagnostics.GetProcessThreads(processId);
for (int i = 0; i < m_Threads.Length; i++)
            {

                if (m_Threads[i].Id.Equals(10))
                {
                    MessageBox.Show("Found it.");
                }
}

何か不足していますか?このスレッドが見つからないのはなぜですか? 私を助けてください。ありがとう。

更新しました

このコードでいくつかの実験を行うという私の最初のアイデアは、マネージ スレッドのステータスを取得する方法を見つけようとすることです。明らかに、私がここに投稿した方法ではうまくいきません。私の質問は、指定されたスレッド ID を持つマネージド スレッドのステータスを知るにはどうすればよいですか? ありがとう。

4

2 に答える 2

5

Thread.ManagedThreadId比較ProcessThread.Idできません。1 つ目は .NET ランタイムによって割り当てられ、2 つ目は OS が各スレッドに割り当てるネイティブ スレッド ハンドルの値です。

一方を他方にマップすることもできません。

アンマネージド ホストはマネージド スレッドとアンマネージド スレッドの関係を制御できるため、オペレーティング システムの ThreadId とマネージド スレッドとの関係は固定されていません。具体的には、洗練されたホストはファイバー API を使用して、同じオペレーティング システム スレッドに対して多くのマネージド スレッドをスケジュールしたり、異なるオペレーティング システム スレッド間でマネージド スレッドを移動したりできます。

したがって、コードをそのまま動作させることはできません。

余談ですが、ここで競合状態が発生する可能性があります。

ProcessThread[] threads = new ProcessThread[proc.Threads.Count];
proc.Threads.CopyTo(threads, 0);

proc.Threads配列が初期化された後、CopyTo実行前に変更される可能性があります。この競合状態を回避するproc.Threadsには、1 回だけ評価します。次に例を示します。

var threads = proc.Threads.ToArray();
于 2013-01-30T11:22:41.317 に答える
3

プロセス スレッドはアンマネージスレッドです。aThread.CurrentThreadマネージドスレッドです。この 2 つは関連していますが、2 つの間に 1:1 のマッピングがあることは保証されません。また、マネージド スレッドが同じアンマネージド スレッドに関連付けられたままになることも保証されません。

ManagedThreadIdアンマネージ スレッドと比較する場合は、 を見ないことをお勧めします。

于 2013-01-30T11:24:15.963 に答える