我有一个Windows窗体应用程序,其中有一个Button。如果单击它,则会启动一个包含大量工作的大循环,这可能需要一些时间(最多几分钟)。在那段时间里,窗户对任何事情都没有反应,你甚至无法移动它。什么方式去这里?我可以拨打一个窗口更新功能吗?我是否必须在新线程中运行循环?
答案 0 :(得分:3)
我是否必须在新线程中运行循环?
是的,您可以使用BackgroundWorker
类进行长时间操作,并通过form.Invoke
从其他线程更新应用程序的界面。
C# Winform ProgressBar and BackgroundWorker
Best Practice for BackGroundWorker in WinForms using an MVP architecture
答案 1 :(得分:2)
使用多线程 - 这是我前面写的一个例子。你基本上在另一个线程上进行所有处理,因此它不会占用GUI线程。
http://wraithnath.blogspot.com/2010/09/simple-multi-threading-example.html
单击按钮时启动一个新线程(如果您将处理线程声明为成员,则可以将其停止等,如果要取消该过程,还可以在处理循环中检查一个IsProcessing成员变量) )
//Create a new Thread start object passing the method to be started
ThreadStart oThreadStart = new ThreadStart(this.DoWork);
//Create a new threat passing the start details
Thread oThread = new Thread(oThreadStart);
//Optionally give the Thread a name
oThread.Name = "Processing Thread";
//Start the thread
oThread.Start();
有一个处理方法
/// <summary>
/// Simulate doing work
/// </summary>
private void DoWork()
{
try
{
for (int i = 0; i < m_RecordCount; i++)
{
//Sleep for 100 miliseconds to simulate work
Thread.Sleep(100);
//increment the progress bar by invoking it on the main window thread
progressBar.Invoke(
(MethodInvoker)
delegate
{
//Increment the progress bar
progressBar.Increment(1);
}
);
}
//Join the thread
Thread.CurrentThread.Join(0);
}
catch (Exception)
{
throw;
}
}