如何在单击按钮后使用后台工作程序加载表单?我会使用它,因为我的表单需要大约20-30秒才能加载。请帮帮我。
答案 0 :(得分:0)
这是一个简单表单项目的示例实现类。我正在使用同步上下文来对UI线程的进度更新进行编组。在构造函数中,它获取当前UI线程的上下文,以便可以在后台工作线程中使用它来提供状态更新。
我还向您展示了如何取消正在运行的后台工作人员。
public partial class Form1 : Form
{
BackgroundWorker _worker = new BackgroundWorker();
SynchronizationContext _syncContext;
public Form1()
{
InitializeComponent();
_syncContext = SynchronizationContext.Current;
}
private void btnLoadForm_Click(object sender, EventArgs e)
{
_worker.WorkerReportsProgress = true;
_worker.WorkerSupportsCancellation = true;
_worker.DoWork += new DoWorkEventHandler(HandleDoWork);
_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(HandleWorkerCompleted);
_worker.ProgressChanged += new ProgressChangedEventHandler(HandleProgressChanged);
_worker.RunWorkerAsync();
}
private void btnCancel_Click(object sender, EventArgs e)
{
if (_worker.WorkerSupportsCancellation)
{
_worker.CancelAsync();
}
}
private void HandleDoWork(object sender, DoWorkEventArgs e)
{
// DO Any work to instantiate the form
System.Threading.Thread.Sleep(2000);
if (_worker.CancellationPending)
{
e.Cancel = true;
}
else
{
Form2 newForm = new Form2();
newForm.ShowDialog();
}
}
private void HandleProgressChanged(object sender, ProgressChangedEventArgs e)
{
// DO Progress Bar Updates Here
SendOrPostCallback callback = new SendOrPostCallback((o) =>
{
label1.Text = "This is my Async content";
});
_syncContext.Send(callback, null);
}
private void HandleWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// DO Any completed step items here
}
}