【问题标题】:C# running WMI query while loading formC# 在加载表单时运行 WMI 查询
【发布时间】:2015-05-13 20:17:00
【问题描述】:

我有一个 C#/Winforms 程序,它需要在初始表单上列出计算机的网络适配器,所以这是我的函数的简化版本,用于整理该列表:

void LoadNicList() 
{
    ManagementObjectSearcher mos = new ManagementObjectSearcher(@"SELECT * 
                                         FROM   Win32_NetworkAdapter 
                                         WHERE  Manufacturer != 'Microsoft'
                                         AND NOT ProductName LIKE '%Wireless%'
                                         AND NOT ProductName LIKE '%Wifi%'
                                         AND NOT ProductName LIKE '%Wi-Fi%'
                                         AND NOT PNPDeviceID LIKE 'ROOT\\%'");
    foreach (ManagementObject mo in mos.Get())
    {
        if (mo["MACAddress"] != null)
        {
            comboBox1.Items.Add(mo["name"].ToString());
        }
    }
}

为了简单起见,我没有包含 try/catch 或任何其他的东西,但是这个函数应该可以编译和运行。此函数由 Form1_Load() 调用。问题是,这会导致加载表单的时间很长,并且无法使用正常的 async/await 函数。

我发现这篇关于异步运行 ManagementObjectSearcher 的 MSDN 文章:https://msdn.microsoft.com/en-us/library/cc143292.aspx 我想在表单以组合框中的“正在加载”消息开始时在后台启动 LoadNicList(),然后在列表准备好后填充列表,但我不知道如何。这可行吗?

【问题讨论】:

  • 你试过使用TaskFactory吗?它在 .net4 中可用,但您可以在启动时启动一个任务来运行您的 LoadNics() 方法,然后等待它完成后再继续,或者让它自行完成。
  • KPS,不,我从没听说过,我看看今晚能不能成功!谢谢!
  • 你调用了错误的 Get() 见here
  • 查看我的答案以获取示例代码。 @RadioSpace 你这么说是有原因的吗?
  • @KPS Get 有一个在我的评论中链接的重载。我个人认为这项任务更好,因为您可以管理它。

标签: c# winforms asynchronous wmi-query


【解决方案1】:

尝试使用它而不是仅仅使用 LoadNicList()

    //create cancellation token for future use
            CancellationToken cancellationToken = new CancellationToken();

//uischeduler is used to update the UI using the main thread
            TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
            Task.Factory.StartNew(() =>
                            {
                                LoadNicList();
                            }, cancellationToken, TaskCreationOptions.None, uiScheduler);

【讨论】:

  • 我刚把它放进去,它有点工作,现在弹出主窗体,但一些按钮有延迟绘制,并且对文本框的更改直到 LoadNicList( ) 已完成。感谢您的建议,我认为这将使我朝着正确的方向前进。
  • 你可以这样做: var task = Task.Factory.StartNew(() => { LoadNicList(); }, cancellationToken, TaskCreationOptions.None, uiScheduler);然后你就可以执行 task.Wait() 并等待 NIC 列表加载后再继续
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多