Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不冻结UI的情况下连续更新列表_C#_.net_Winforms_Visual Studio 2013 - Fatal编程技术网

C# 如何在不冻结UI的情况下连续更新列表

C# 如何在不冻结UI的情况下连续更新列表,c#,.net,winforms,visual-studio-2013,C#,.net,Winforms,Visual Studio 2013,好的,我有一个方法,可以读取正在运行的进程、筛选、排序,然后在相应的列表框中显示它们的名称(正在运行的进程和未运行的进程)。我正在异步运行此方法,以便GUI可以继续运行,同时process viewer继续运行,直到程序退出。我使用了一个简单的while循环来实现这一点,但该方法似乎没有循环。该方法第一次正确地运行,但它不会继续运行,而是在第一次迭代后停止 如何无限循环并继续更新列表框 这是我的方法 private async void process_viewer() {

好的,我有一个方法,可以读取正在运行的进程、筛选、排序,然后在相应的列表框中显示它们的名称(正在运行的进程和未运行的进程)。我正在异步运行此方法,以便GUI可以继续运行,同时process viewer继续运行,直到程序退出。我使用了一个简单的while循环来实现这一点,但该方法似乎没有循环。该方法第一次正确地运行,但它不会继续运行,而是在第一次迭代后停止

如何无限循环并继续更新列表框

这是我的方法

private async void process_viewer()
    { 
        while (true)
        {

        Process[] running_processes = Process.GetProcesses();

            foreach (Process proc in running_processes)
            {
                this.process_list.Add(proc.ProcessName);
            }

            if (this.process_list.Contains("notepad"))
            {
                this.running_list.Add("notepad.exe");
            }
            else
            {
                this.stopped_list.Add("notepad.exe");
            }

            if (this.process_list.Contains("calc"))
            {
                this.running_list.Add("calc.exe");
            }
            else
            {
                this.stopped_list.Add("calc.exe");
            }

            if (this.process_list.Contains("cmd"))
            {
                this.running_list.Add("cmd.exe");
            }
            else
            {
                this.stopped_list.Add("cmd.exe");
            }

            running.SelectionMode = SelectionMode.None;
            stopped.SelectionMode = SelectionMode.None;

            running.DataSource = this.running_list;
            stopped.DataSource = this.stopped_list;

            this.running_list.Clear();
            this.stopped_list.Clear();
            this.process_list.Clear();

            await Task.Delay(500);
        }
    }

看起来,无论您将数据绑定到哪个控件,实际上都不会立即从该数据源读取数据,而是将数据绑定安排在将来某个时间点进行,在此时间点之后,您已经清除了列表,导致控件绑定到空列表

实际上,没有任何理由让这些列表首先成为字段。您应该简单地重新创建在循环的每个迭代中正在运行或未运行的进程(您关心的)列表,将这些结果绑定到您的控件,然后在再次循环时不记得以前任何迭代中的任何内容

private static string[] processNamesICareAbout =
    new[] { "notepad", "calc", "cmd" };
private async void process_viewer()
{
    while (true)
    {
        var processes = Process.GetProcesses()
            .Select(process => process.ProcessName);

        running.SelectionMode = SelectionMode.None;
        stopped.SelectionMode = SelectionMode.None;
        running.DataSource = processNamesICareAbout.Intersect(processes).ToList();
        stopped.DataSource = processNamesICareAbout.Except(processes).ToList();

        await Task.Delay(500);
    }
}

如何使用这个方法?它在类构造函数中被调用。你可以在延迟后放入一些代码来检查它是否被命中。好的,Stillgar我添加了一行代码,在延迟后打开一个弹出窗口,它确实工作了(并且有一个暂停),所以它执行到循环的第一次迭代结束。@user3846131,然后继续检查。它从哪里开始遇到问题?第一个地方是哪里?它不能正常工作,或者卡住了,或者其他什么?好的,我知道你在这里试图做什么,我认为你是正确的。然而,我得到了一个错误+$exception{System.ArgumentException:复杂数据绑定接受IList或IListSource.at System.Windows.Forms.ListControl.set_DataSource(对象值)at Proxy_Commander.Commander.d__2.MoveNext()作为数据源@Avelyn_Grey然后将一个列表传递给它,正如错误所述。这在数据绑定世界中是不寻常的,但错误消息非常简单。看看您可以使用的操作,找到一个可以将
IEnumerable
转换为实现
IList
的操作。是的,我知道了,我添加了。tolist();最后,很简单。我在你的代码中更改了它,一旦它被审查和批准,我会将它标记为答案。你是炸弹兵,谢谢!!!