1

メインフォームと進捗状況が表示される別のフォームを使用してマルチスレッドアプリケーションを開発しています。最初に:MainFormでProgressFormを作成します

Progress p=new Progress();

2番目:クラスModelの新しいインスタンスを作成します(アプリ内のすべてのデータを使用)。

Model m = new Model();

そして、イベントを購読します:

 m.OperationStarted += new EventHandler(OnCopyStarted);

private void OnCopyStarted(object sender, EventArgs e)
{
  p.Show();
}

3番目:別のモデルのプロパティを変更する別のスレッドでいくつかの操作を実行します

 private bool isStarted;
            public bool IsStarted
            {
                get{return isStarted;}
                set 
                {
                    isStarted = value;
                    if (isStarted && OperationStarted != null)
                    { 
                        OperationStarted(this, EventArgs.Empty);
                    }
                }
            }

私の質問は次のとおりです。進行状況フォームがメインスレッドに表示されないのはなぜですか?ロックアップなしで実行するにはどうすればよいですか?

4

2 に答える 2

3

すべてのUI操作は、メインUIスレッドで実行する必要があります。

メソッドは別のOnCopyStartedスレッドで呼び出されているため、ダイアログを表示する前にUIスレッドに切り替える必要があります。

フォームのBeginInvokeを使用して、UIスレッドに切り替えることができます。そのような:

void OnCopyStarted(object sender, EventArgs e)
{
   p.BeginInvoke((Action) (() => p.Show()));
}
于 2012-11-06T06:00:26.710 に答える
2

それを試してみてください :

var t = new Thread(() => {
            Application.Run(new Progress ());
        });
t.Start();
于 2012-11-06T05:40:15.767 に答える