如何使用后台工作者加载表单? C#

时间:2015-05-28 13:09:22

标签: c# backgroundworker

如何在单击按钮后使用后台工作程序加载表单?我会使用它,因为我的表单需要大约20-30秒才能加载。请帮帮我。

1 个答案:

答案 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
    }

}