我有一个程序需要10到20秒才能启动。程序启动时,我需要显示一个带有进度条的窗口。我知道BackgroundWorker是执行此操作的正确方法,但是很遗憾,我现在没有时间使用线程对整个gui进行重做。这是我正在尝试的一些代码,但无法正常工作。谁能帮忙..?
using System;
using System.Threading;
using System.Windows;
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
Thread t = new Thread(ShowLoadingWindow);
t.SetApartmentState(ApartmentState.STA);
t.Priority = ThreadPriority.Highest;
t.Start();
DoSomeLongTask();
keepLooping = false;
}
bool keepLooping = true;
private void ShowLoadingWindow()
{
LoadingWindow lw = new LoadingWindow();
lw.Show();
while (keepLooping)
{
Thread.Sleep(1);
}
lw.Close();
}
private void DoSomeLongTask()
{
for (int i = 0; i < 20000; i++)
{
GC.Collect();
}
}
}
}
加载窗口只是带有进度条的裸窗口。这怎么不起作用?
最佳答案
您仍在主线程中完成很长的任务。您需要在主线程中显示加载窗口,并在后台执行冗长的任务。
实际上,使用BackgroundWorker是最简单的解决方案:
BackgroundWorker bw;
LoadingWindow lw;
公共Window1(){
bw = new BackgroundWorker();
lw = new LoadingWindow();
bw.DoWork + =(发送方,参数)=> {
//在这里做冗长的工作-这将在单独的线程中进行
...
}
bw.RunWorkerCompleted + =(发送方,参数)=> {
if(args.Error!= null)//如果在DoWork期间发生异常,
MessageBox.Show(args.Error.ToString()); //在这里进行错误处理
//在此处关闭加载窗口
...
}
//打开并在此处显示您的加载窗口
...
bw.RunWorkerAsync(); //启动后台工作者
}
关于c# - C#,WPF,无需后台工作人员即可更新GUI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2200744/