-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

質問する前に、実際にドキュメントを参照する必要があります。とにかく、これはあなたがそれをどのように行うことができるかの例です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 に答える
1

a を使用しBackgroundWorkerて、別のスレッドで作業を行います。

于 2011-12-23T12:31:37.083 に答える
1

BackgroundWorkerを使用する

[編集]ここで利用可能なチュートリアル

于 2011-12-23T12:32:09.163 に答える
0

バックグラウンドワーカーを使用して重い操作を実行します。タスクの進行状況を報告するイベントがあるため、これを使用して進行状況バーを更新できます。

于 2011-12-23T12:33:04.013 に答える