操作繁忙时,表单不执行任何操作(冻结)

我有一个使用C#的WinForms应用程序。 我尝试从文件中读取一些数据并将其插入到数据表中。 当这个操作很忙时,我的表单冻结了,我无法移动它。 有谁知道我怎么能解决这个问题?

这可能是因为您在UI线程上执行操作。

将文件和数据库操作移动到另一个线程,以防止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!"); } } } 

这是因为您使用主线程执行需要很长时间的操作。 最好的解决方案是使用另一个线程来读取您需要的文件,这将允许主线程正常更新。 在这里阅读更多关于线程的信息http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx

您的UI相关控件在UI thread上运行,并且通常,您不应该在UI线程上花费大量时间(如果这样做,您的UI线程将阻塞/冻结,直到该任务完成)。 还有另一种称为Worker Thread ,您可以创建并使用它来执行长时间运行的任务,这将保持您的UI响应/不冻结。 以下是有关如何Threading in Windows Forms使用Threading in Windows Forms的说明。

或者,Winforms中有一个Backgroundworker component ,您可以使用它来在非UI线程上执行任务,这将在此处进行说明。

利用任务 。 即

 Task.Factory.StartNew(() => DoAction()).ContinueWith(() => DoAfterActionIsComplete());