大家好,
我以前编写了一个用BackgroundWorker处理一个导入过程的实例。
当点击“导入”按钮选择完要导入的文件后,程序将运行bkWorker.RunWorkerAsync()将导入过程交给后台线程。
那么此时我再次点击“导入”按钮,仍可以打开一个OpenFileDialog的实例。但是我刚刚编写了一个简单的窗体,发现在将更新进度条value的程序交给线程后,主线程无法像之前一样继续点击“导入”按钮。麻烦大家指导一下,多谢。public partial class Form1 : Form
    {
        private BackgroundWorker bkWorker = new BackgroundWorker();        public Form1()
        {
            InitializeComponent();            bkWorker.WorkerReportsProgress = true;
            bkWorker.WorkerSupportsCancellation = true;
            bkWorker.DoWork += new DoWorkEventHandler(DoWork);
            bkWorker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
            bkWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);  
        }        private void 开始_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Title = "请选择要导入的文件:";
            dlg.Filter = "Excel文件(*.xls)|*.xls|所有文件|*.*";
            dlg.Multiselect = true;            if (dlg.ShowDialog() == DialogResult.OK)
            {
                progressBar1.Maximum = 1000000;
                bkWorker.RunWorkerAsync();
            }
        }        private void DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i < 1000000; i++)
            {                    bkWorker.ReportProgress(i);
            }
        }        public void ProgessChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }        public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Done!");
        }
    }

解决方案 »

  1.   

    缩小进度粒度试下
    progressBar1.Maximum = 100;
    for (int i = 0; i < 1000000; i++)
    {
        if(i % 100 == 99)
        bkWorker.ReportProgress(i/99);
    }另外,在DoWork还未完成的情况下,再点击,似乎应该是弹出提示,或者将按钮禁用才是
    如果真需要点一次弹一个,那你还是点一次开一个线程吧
      

  2.   

    我明白您的意思,在未完成的情况下,如果再次bkWorker.RunWorkerAsync()会发生错误。但是在调用bkWorker.RunWorkerAsync()之前,我是打开FileDialog,只要我不点确定,就不应该出错。至于我关注的假死问题,我认为问题应该是dowork中太“简单”了,导致与主线程交互太频繁,从而导致的假死。您有什么看法?