winform表单变得无响应
本文关键字:响应 表单 winform | 更新日期: 2023-09-27 17:58:52
我正在启动一个线程并更新表单元素,但下面的代码使表单无法解析,请说明我在这里做错了什么。
private void StartTimer()
{
Thread t = new Thread(Updates);
t.IsBackground = true;
t.Start();
}
private void Updates()
{
try
{
while (true)
{
this.Invoke((MethodInvoker)delegate
{
lblTotalImages.Text = AppHelper.GetTotalCount(textBox1.Text).ToString();
if (sitename != null)
{
lblTotalPosted.Text = AppHelper.GetPostedCount(sitename).ToString();
// Application.DoEvents();
}
});
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
}
}
编辑-------感谢@Servy介绍了我从未使用过的任务并行库,这是我使用计时器和任务工厂提出的解决方案ya for.net 4没有库扩展,与2010年相比,我有这个工作完美的
enter code here private void timer1_Tick(object sender, EventArgs e)
{
Task.Factory.StartNew(() => AppHelper.GetTotalCount(textBox1.Text)).ContinueWith(t => lblTotalImages.Text = t.Result.ToString(), TaskScheduler.FromCurrentSynchronizationContext());
if (sitename != null)
{
Task.Factory.StartNew(() => AppHelper.GetPostedCount(sitename)).ContinueWith(t => lblTotalPosted.Text = t.Result.ToString(), TaskScheduler.FromCurrentSynchronizationContext());
}
}
您正在对Invoke
的调用中执行某种长时间运行的非UI操作,这意味着它是在UI线程中完成的。您应该努力只更新UI线程中的UI;确保任何长时间运行的非UI代码都在对UI线程的任何调用之外。
await
的使用也使这个解决方案能够以更简单、更有效的方式编写:
public async void StartTimer()
{
while (true)
{
string text = textBox1.Text;
lblTotalImages.Text = await Task.Run(() =>
AppHelper.GetTotalCount(text).ToString());
if (sitename != null)
{
lblTotalPosted.Text = await Task.Run(() =>
AppHelper.GetPostedCount(sitename).ToString());
}
await Task.Delay(TimeSpan.FromSeconds(1));
}
}