表单在操作繁忙时不执行任何操作(冻结)
本文关键字:操作 任何 冻结 执行 表单 | 更新日期: 2023-09-27 18:26:48
我有一个使用C#的WinForms应用程序。我尝试从文件中读取一些数据,并将其插入到数据表中。当这个操作很忙时,我的表单冻结了,我无法移动它。有人知道我该如何解决这个问题吗?
这可能是因为您在UI线程上执行操作。
将"文件"answers"数据库"操作移动到另一个线程,以防止UI线程冻结。
下面是一个使用ThreadPool的示例。作为一种选择,你可以手动启动线程,但如果你想中止它们等,你需要手动跟踪它们。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// With ThreadPool
ThreadPool.QueueUserWorkItem(DoWork);
}
private void DoWork(object state)
{
// Do Expensive Work
for (int i = 0; i < 100; i++)
{
Thread.Sleep(10);
}
System.Diagnostics.Debug.WriteLine("DoWork finished!");
}
}
}
利用任务。即
Task.Factory.StartNew(() => DoAction()).ContinueWith(() => DoAfterActionIsComplete());
您的UI相关控件在UI thread
上运行,通常,您不应该在UI线程上进行耗时的工作(如果这样做,您的UI线程将阻塞/冻结,直到该任务完成)。还有另一种类型的线程称为Worker Thread
,您可以创建它并使用它来执行长时间运行的任务,这将使您的UI保持响应/不冻结。
或者,Winforms中有一个Backgroundworker component
,您可以利用它在非UI线程上执行任务,这里对此进行了解释。
这是因为您使用主线程来执行耗时较长的操作。最好的解决方案是使用另一个线程来读取所需的文件,这将允许主线程正常更新。在此处阅读有关线程的更多信息http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx