7

ManagementObjectSearcher を使用した WMI クエリがあります。

通常、これは正常に機能しますが、一部のマシンでは、ハングしたり、まったく返されません。クエリにタイムアウトを設定しようとしましたが、違いはないようです。

これは私のコードです:

using (var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process"))
{
   try
   {
        query.Options.Timeout = new TimeSpan(0, 0, 10);
        query.Options.ReturnImmediately = false;
        Log.Info("Query built");
        foreach (ManagementObject obj in query.Get())
        {
            using (obj)
            {
                var key = (uint)obj.GetPropertyValue("IDProcess");
                Log.Info(key);
                processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") };
            }
        }
    }
}

ログに「Query built」と表示された後、何も表示されず、プログラムが応答しなくなります。

手動タイムアウト設定の有無にかかわらず試しました。

4

2 に答える 2

3

最近、「C# コマンド ライン」で WMI クエリをテストしたところ、WMI は期待どおりに機能しましたが、WPF で書き直した後、あなたと同じ問題に直面しました。いくつかの調査の結果、STA(Single Threading Apartment モード) で動作しているが WPF が STA モードで動作している場合に WMI がハングすることがわかったので、ThreadPool を使用しているタスクを実行します (ケースに書き直します):

        ThreadPool.QueueUserWorkItem((_) =>
            {
                using (var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process"))
                {
                    try
                    {
                        query.Options.Timeout = new TimeSpan(0, 0, 10);
                        query.Options.ReturnImmediately = false;
                        Log.Info("Query built");
                        foreach (ManagementObject obj in query.Get())
                        {
                            using (obj)
                            {
                                var key = (uint)obj.GetPropertyValue("IDProcess");
                                Log.Info(key);
                                processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") };
                            }
                        }
                    }
                    catch (SystemException)
                    {
                    }
                }
            });
于 2013-09-19T08:48:27.337 に答える
-3

「使用」なしで機能するはずです

var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet  FROM Win32_PerfFormattedData_PerfProc_Process");
try
{
    query.Options.Timeout = new TimeSpan(0, 0, 10);
    query.Options.ReturnImmediately = false;
    log.Info("Query built");
    foreach (ManagementObject obj in query.Get())
    {
        using (obj)
        {
            var key = (uint)obj.GetPropertyValue("IDProcess");
            Log.Info(key);
            processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") };
        }
    }
 }
于 2012-09-20T23:12:44.377 に答える