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

本文关键字:操作 任何 冻结 执行 表单 | 更新日期: 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