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

时间:2012-03-05 11:40:37

标签: c# winforms

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

4 个答案:

答案 0 :(得分:9)

这可能是因为您在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!");
      }

   }
}

答案 1 :(得分:1)

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

的更多信息

答案 2 :(得分:1)

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

或者,Winforms中有一个Backgroundworker component,您可以利用它在非UI线程上执行任务,解释为here

答案 3 :(得分:0)

利用Tasks。即。

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