C# 如何在长时间运行的代码启动之前更新GUI计时器?
这个程序是关于计算txt文件中的单词的。 我有两张表格。Form1是关于选择文件和单词的。这些数据我将传递到form2,在那里我将启动GUI计时器和计算字数的算法。但算法的执行速度比加载的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
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);
}