当前位置: 动力学知识库 > 问答 > 编程问答 >

c# - Form does not displayed as Dialog inside backgroundworker?

问题描述:

the Form does not displayed as Dialog inside backgroundworker?

Here is my code:

//From Form1

private void backgroundWorkerResult_DoWork(object sender, DoWorkEventArgs e)

{

//do something here

backgroundWorkerResult.ReportProgress(100);

frmMessageBox frmMsgBox = new frmMessageBox();

frmMsgBox.ShowDialog();

}

Even though i already showed the frmMsgBox as a dialog i Can still click the Form1 that supposed to be not? how can fix this?

网友答案:

I created a simple code sample that you can use to understand how the background worker works. Copy the code to a test form and add the following controls

  1. Label Control - Name it 'lblStatus'
  2. Progressbar Control - It should be named progressBar1.
  3. Add 2 buttons named 'btnStartAsyncOperation' and 'btnCancel' and link their click events.

Basically you should display the results in the RunWorkerCompleted event

    public partial class Form1 : Form
    {
        BackgroundWorker backgroundWorker;

        public Form1()
        {
            InitializeComponent();
            backgroundWorker = new BackgroundWorker {WorkerReportsProgress = true, WorkerSupportsCancellation = true};

            backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork);
            backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(BackgroundWorker_ProgressChanged);
            backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorker_RunWorkerCompleted);

        }

        void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
                lblStatus.Text = "Task Cancelled.";
            else if (e.Error != null)
                lblStatus.Text = "Error - " + e.Error.Message;
            else
                lblStatus.Text = "Task Completed...";

            btnStartAsyncOperation.Enabled = true;
            btnCancel.Enabled = false;
        }

        void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            lblStatus.Text = "Processing......" + progressBar1.Value.ToString() + "%";
        }

        void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {
                System.Threading.Thread.Sleep(100);
                backgroundWorker.ReportProgress(i);
                if (backgroundWorker.CancellationPending)
                {
                    e.Cancel = true;
                    backgroundWorker.ReportProgress(0);
                    return;
                }
            }
            backgroundWorker.ReportProgress(100);
        }

        private void btnStartAsyncOperation_Click(object sender, EventArgs e)
        {
            btnStartAsyncOperation.Enabled = false;
            btnCancel.Enabled = true;
            backgroundWorker.RunWorkerAsync();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            if (backgroundWorker.IsBusy)
            {
                backgroundWorker.CancelAsync();
            }
        }
    }

Edited as per comment by the OP

In the DoWork event, set your string as follows

 e.Result = "Your String";

and in the RunWorkerCompleted event

string muResult = Convert.ToString(e.Result);

NOTE: e.Result is an object so you can even set your custom classes with multiple properties in it.

分享给朋友:
您可能感兴趣的文章:
随机阅读: