2

10 個のメソッドを含むボタン クリックがあります。ここでは、ボタンのクリックまたはコードのどこかでスレッドを使用して、Windows フォーム アプリケーションがハングしないようにします。

これは私がこれまでに試したことです... !!

                collectListOfPTags();

                REqDocCheck = new Thread(new ThreadStart(collectListOfPTags));

                REqDocCheck.IsBackground = true;

                REqDocCheck.Start();

                WaitHandle[] AWait = new WaitHandle[] { new AutoResetEvent(false) };
                while (REqDocCheck.IsAlive)
                {
                    WaitHandle.WaitAny(AWait, 50, false);
                    System.Windows.Forms.Application.DoEvents();
                } 

メソッドcollectionListOfPtags()で、「コンボボックスが作成されたスレッド以外のスレッドからアクセスされた」という例外が発生しています

お待ちいただきありがとうございます..どんな助けでも大歓迎です..

4

3 に答える 3

0

BackgroundWorkerこれは、コンポーネントに適しているように見えます。

collectListOfPTagsメソッドを 2 つのメソッドに分割します。1つ目はデータを収集して処理し、2 つ目は UI コントロールを更新します。

このようなもの:

void OnClick( ... )
{
  var results = new List<string>();

  var bw = new BackgroundWorker();

  bw.DoWork += ( s, e ) => CollectData( results );
  bw.RunWorkerCompleted += ( s, e ) => UpdateUI( results );

  bw.RunWorkerAsync();
}

void CollectData( List<string> results )
{
  ... build strings and add them to the results list
}

void UpdateUI( List<string> results )
{
  ... update the ComboBox from the results
}

はスレッド プール スレッドのバックグラウンドで実行されますが、正しくアクセスできるように UI スレッドで実行BackgroundWorkerされます。CollectDataUpdateUIComboBox

于 2013-04-05T11:55:20.197 に答える
0

ここで必要なのはデリゲートです。デリゲートを作成し、それをスレッド関数から GUI にアクセスする関数に入れるだけです。

public delegate void DemoDelegate();

あなたのコードでは、

collectionListOfPtags()
{
    if ((this.InvokeRequired)) {
    this.Invoke(new DemoDelegate(collectionListOfPtags));
    return;
    }

     // Your Code HERE
}

これがうまくいくことを願っています!幸運を :-)

于 2013-04-05T11:49:18.770 に答える
0

スレッドプールを見てください。スレッド プールは、バックグラウンドで複数のタスクを実行するために使用できるスレッドのコレクションです。それらは使いやすく、スレッドセーフです。

これは(本当に単純な)例です: http://msdn.microsoft.com/en-us/library/h4732ks0.aspx

于 2013-04-05T13:09:58.077 に答える