-5

在我的 Winform 中,单击按钮时实现了读取文件方法。当读取大文件时,我的 UI 会挂起,直到循环结束。我需要一直控制我的 UI。

我知道这是以前做过的,我尝试了一些,但是当我尝试使用这样的表单控件时仍然出现错误:(翻译!)

控制元素 comboBox1 的访问来自另一个线程,而不是创建它的线程!!!

   private void button1_Click(object sender, EventArgs e)

         {  
            //some code
            using (StreamReader sr = new StreamReader(file,  System.Text.Encoding.ASCII))
                 {

                   while (sr.EndOfStream == false)
                   {
                    line = sr.ReadLine();
                    UpdateProgressBar(line.Length);
                   }

                 }

              //some code
          }
4

5 回答 5

2

在表单(或控件)加载时将BackgroundWorker添加到您的类。然后连接它的事件:

BackgroundWorker _worker;
void Form_Load(object sender, EventArgs e)
{
    _worker = new BackgroundWorker();
    _worker.DoWork += _worker_DoWork;
    _worker.RunWorkerCompleted += _worker_RunWorkerCompleted;
    _worker.ProgressChanged +=_worker_ProgressChanged;
    _worker.WorkerReportsProgress = true;
}

private void button1_Click(object sender, EventArgs e)
{
    _worker.RunWorkerAsync(file);//pass on the file name
}

private void _worker_DoWork(object sender, DoWorkEventArgs e)
{
    var file = e.Argument as String;
    using (StreamReader sr = new StreamReader(file, Encoding.ASCII))
    {
        while (sr.EndOfStream == false)
        {
            line = sr.ReadLine();
            _worker.ReportProgress(line.Length);
        }
    }
}

private void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //Report porogress bar change
    UpdateProgressBar(e.ProgressPercentage);
}

private void _worker_RunWorkerCompleted(object sender, 
                                   RunWorkerCompletedEventArgs e)
{
    //do any stuff you want after reading the file.
}

在此处阅读有关此内容的更多信息。

于 2011-12-23T12:46:04.060 回答
1

使用 aBackgroundWorker在单独的线程上完成工作。

于 2011-12-23T12:31:37.083 回答
1

使用BackgroundWorker

[编辑]此处提供教程

于 2011-12-23T12:32:09.163 回答
1

在提出问题之前,您确实应该查阅文档。无论如何,这是一个如何使用 a 的示例BackgroundWorker

private void button1_Click(object sender, EventArgs e)
{
    BackgroundWorker worker = new BackgroundWorker;
    worker.WorkerReportsProgress = true;
    worker.ProgressChanged += ProgressChanged;
    worker.DoWork += ReadStream;
    worker.RunWorkerAsync(comboBox1.Text);
}

private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    UpdateProgressBar(e.ProgressPercentage);
    comboBox1.Text = e.UserState.ToString();
}

private void ReadStream(object sender, DoWorkEventArgs doWorkEventArgs)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    string line;
    string comboBoxText = doWorkEventArgs.Argument.ToString();
    using (StreamReader sr = new StreamReader("file", System.Text.Encoding.ASCII))
    {
        while (!sr.EndOfStream)
        {
            line = sr.ReadLine();
            worker.ReportProgress(line.Length);
            worker.ReportProgress(line.Length, "NEW COMBOBOX TEXT");
        }

    }
}
于 2011-12-23T12:46:52.900 回答
0

使用 backgroundworker 执行繁重的操作。它具有报告任务进度的事件,因此您可以使用它来更新进度条。

于 2011-12-23T12:33:04.013 回答