【发布时间】: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