-1

実行フロー:

  1. メインスレッドから、長時間実行されるプロセスを実行している新しいスレッド (並列スレッド) を呼び出しました。
  2. 並列スレッドがメイン スレッド UI を更新しています。
  3. 並列スレッドが完了するまでメインスレッドを待機させました。
  4. 2 つのスレッド間の同期が必要です。
  5. メインスレッドで並列スレッドの結果を使用する必要があるため、並列プロセスが完了するまでメインスレッドをブロックしました。

これが問題のある私のコードです。問題を解決するための提案をしてください。

    private readonly AutoResetEvent _resetEvent = new AutoResetEvent(false);
    private event EventHandler Workcompleted;

    private void button1_Click(object sender, EventArgs e)
    {
        Workcompleted += Completed;
        Thread thr = new Thread(UpdateUI);
        thr.Start("");

        _resetEvent.WaitOne();

         // Logical operation dependent on parallel process final result 

    }

    private void Completed(object sender, EventArgs args)
    {
        _resetEvent.Set();
    }

    private void UpdateUI(object txt)
    {
        for (int i = 0; i < 10; i++)
        {
            if (label1.InvokeRequired)
            {
                label1.Invoke(new ParameterizedThreadStart(UpdateUI), i.ToString());
            }
            else
            {
                label1.Text = (string)txt;
                Thread.Sleep(100);
            }
        }

        if (Workcompleted != null)
            Workcompleted(this, new EventArgs());

    }
4

3 に答える 3

3

並列スレッドが完了するまでメインスレッドを待機させました。

そして、あなたは自分自身をブロックしました。そもそもなんで新スレ立てたの?UI の応答性を維持するため。とにかく、あなたはそれをブロックしました。ブロックしないでください。スレッドの実行中に何をしたいのかわかりません。おそらくコントロールの状態を変更し、スレッドの完了時にそれらをリセットしますが、UI スレッドをブロックすることは望ましくありません。それをやめて、達成したいことを達成するための別の方法を見つけてください。

于 2015-01-02T12:08:31.800 に答える
0
 public delegate void Action();
    private void UpdateUI(object txt)
    {
        this.BeginInvoke((Action)(() =>
        {
            label2.Text = (string)txt;
        })); 
    }

このコードを使用すると、別のスレッドを待つ必要がなくなります...

于 2015-01-02T12:09:25.213 に答える