web-dev-qa-db-ja.com

クロススレッド操作が無効です

可能性のある複製:
クロススレッド操作は無効:作成元のスレッド以外のスレッドからアクセスされたコントロール

さて、私はこれが私にこのエラーを与えている理由を知っています:

クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスされる「Form1」を制御します。

しかし...どうすればこれを実行可能にできますか?

System.Threading.Thread t = new System.Threading.Thread(()=>
{
   // do really hard work and then...
   listView1.Items.Add(lots of items);
   lots more UI work
});
t.Start();

スレッドがいつ、どのように終了するかは気にしないので、新しいスレッドでUIを操作するときに物事がはるかに簡単にならない限り、空想や複雑なatmについてはあまり気にしません。

30
anon271334

できません。 UI操作は、所有スレッドで実行する必要があります。限目。

couldで行うことは、子スレッド上にすべてのそれらの項目を作成し、Control.Invokeを呼び出して、そこでデータバインディングを行うことです。

または、BackgroundWorkerを使用します

    BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += (s, e) => { /* create items */ };
    bw.RunWorkerCompleted += (s, e) => { /* databind UI element*/ };

    bw.RunWorkerAsync();
25
Adam Rackis

別のスレッドからfromのプロパティにアクセスすると、この例外がスローされます。この問題を回避するには、少なくとも2つのオプションがあります。

  1. これらの例外をスローしないようにControlに指示します(推奨されません):

    Control.CheckForIllegalCrossThreadCalls = false;

  2. スレッドセーフ機能の使用:

    private void ThreadSafeFunction(int intVal, bool boolVal)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(
                new MethodInvoker(
                delegate() { ThreadSafeFunction(intVal, boolVal); }));
        }
        else
        {
            //use intval and boolval
        }
    }   
    
13
Alireza Noori