【问题标题】:C# wmi query exceptionC# wmi 查询异常
【发布时间】:2018-12-15 05:36:11
【问题描述】:

我的应用程序中有一个文本框,它使用 wmi 查询和注册表读取来显示一些系统信息。问题是由于操作系统损坏(处理器:不可用等),某些系统不显示某些信息,因此无法使用我的方法或从操作系统内部检索该信息。 所有这些都导致我的应用程序崩溃。 我将如何避免崩溃并为无法检索的每一行显示文本。例如:不可用 我的文本框代码是:

private void TextBox1_Initialized(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.WorkerReportsProgress = true;
        bw.DoWork += new DoWorkEventHandler(delegate (object o, DoWorkEventArgs args)
        {

        });
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(delegate (object o, RunWorkerCompletedEventArgs args)
        {
            TextBox1.Text = Registry.GetValue(@"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString", null).ToString().Replace("(R)", "").Replace("(TM)", "") + Environment.NewLine;
            TextBox1.Text += "Memory: " + getRAMsize() + Environment.NewLine;
            TextBox1.Text += "Free Space: " + GetTotalFreeSpace(sysdrive) + " GB" + Environment.NewLine;
            TextBox1.Text += diskname() + Environment.NewLine;
            if (Is64BitSystem)
            {
                TextBox1.Text += getOS() + " 64bit" + Environment.NewLine;
            }
            else
            {
                TextBox1.Text += getOS() + " 32bit" + Environment.NewLine;
            }
            Clipboard.SetDataObject(TextBox1.Text);
        });
        bw.RunWorkerAsync();
    }

提前致谢。

【问题讨论】:

    标签: c# exception-handling textbox wmi


    【解决方案1】:

    使用 try catach 避免应用程序崩溃:

     string ProcessorNameString = "ProcessorNameString: not available";
            string memory = "Memory: not availbale ";
            string freeSpace = "Free space: not available";
            //add others 
                       try
            {
                ProcessorNameString = Registry.GetValue(@"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString", null).ToString().Replace("(R)", "").Replace("(TM)", "") + Environment.NewLine;
            }
            catch{}
    
            try
            {
                memory = string.Format("Free Space:{0}DB", getRAMsize());
            }
            catch { }
    
            try
            {
                //freeSpace here 
            }
            catch { }
            TextBox1.Text = string.Format("{0}{1}{2}{3}{4}{5}"
                , ProcessorNameString, Environment.NewLine
                , memory, Environment.NewLine
                , freeSpace, Environment.NewLine);
            Clipboard.SetDataObject(TextBox1.Text);
    

    【讨论】:

    • 似乎不正确。如果缺少其中一个,则将显示全部不可用
    • 包装 processNameString、memory、fresSpace 等,分别带有 try catach 子句
    • 我已经复制/粘贴了提供的代码。进入 Windows 7 虚拟机并从注册表中删除“ProcessorNameString”。结果 = 所有其他字符串都显示为不可用,即使它们与该特定注册表项无关。对不起...
    • 我的最后一个代码与您提供的代码完全相同,没有任何修改。我想准确地测试一下。无论如何,我认为你已经走上了正确的道路。为每个查询/行做 try/catch 似乎有效
    • 一个参数,一个try catch,参考最新修改答案
    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多