加载表单

时间:2015-05-13 20:17:01

标签: c# winforms asynchronous wmi-query

我有一个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(),同时表单以组合框中的“正在加载”消息开头,然后填充列表一次它准备好了,但我无法弄清楚如何。那是可行的吗?

1 个答案:

答案 0 :(得分: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);