Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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# 如何在长时间运行的代码启动之前更新GUI计时器?_C#_Winforms - Fatal编程技术网

C# 如何在长时间运行的代码启动之前更新GUI计时器?

C# 如何在长时间运行的代码启动之前更新GUI计时器?,c#,winforms,C#,Winforms,这个程序是关于计算txt文件中的单词的。 我有两张表格。Form1是关于选择文件和单词的。这些数据我将传递到form2,在那里我将启动GUI计时器和计算字数的算法。但算法的执行速度比加载的GUI计时器快 private void Form2_Load(object sender, EventArgs e) { CountWords(); } 使用线程池在后台线程上运行此方法,而不是使用CountWords阻塞UI线程 private void Form2_Load(object

这个程序是关于计算txt文件中的单词的。 我有两张表格。Form1是关于选择文件和单词的。这些数据我将传递到form2,在那里我将启动GUI计时器和计算字数的算法。但算法的执行速度比加载的GUI计时器快

private void Form2_Load(object sender, EventArgs e)
{
    CountWords();
}

使用线程池在后台线程上运行此方法,而不是使用CountWords阻塞UI线程

    private void Form2_Load(object sender, EventArgs e)
    {
        ThreadPool.QueueUserWorkItem(
            new WaitCallback(CountWords));
    }
然后,确保将对UI控件的任何调用封送回从后台线程执行的UI线程:

        foreach (KeyValuePair<string, int> word in words)
        {
            // Need to marshal this back onto the UI thread
            var itemToAdd = word.Key + " " + word.Value + "x";
            this.BeginInvoke(new Action<string>(AddItemToListView), itemToAdd);
        }

开始算法的执行速度比加载的GUI计时器快-不正确,计时器在表单构造函数的InitializeComponents中加载并启动,但它无法运行其事件,因为CountWords阻止UI线程。我建议使用另一个线程调用CountWords函数。在这个线程中,如果必须,通过调用调用函数来更新GUI。如果您在会议期间不需要响应表单,请在创建公共函数后而不是在加载事件中调用CountWords。为什么要用计时器打开文件?文件内容是否会随着时间的推移而改变,并且您需要使用新内容更新UI?如果是这种情况,请参见课程。当一个被监视的文件被修改/删除时,这个类会引发不同的事件。哎哟,是的,我的意思是写BeginInvoke。谢谢。错误CS0123“CountWords”匹配项没有重载delegate抱歉,您需要将CountWords方法更新为私有void CountWordsobject paramThread to thread操作无效:对listView1控件的访问来自创建它的线程以外的线程在哪一行代码上?您是否遵循了我的代码,因为AddItemToListView方法是在UI线程上调用的。请更新您的问题并发布所有源代码。
    private void AddItemToListView(string item)
    {
        listView1.Items.Add(item);
    }