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