さて、私はこれが私にこのエラーを与えている理由を知っています:
クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスされる「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についてはあまり気にしません。
できません。 UI操作は、所有スレッドで実行する必要があります。限目。
couldで行うことは、子スレッド上にすべてのそれらの項目を作成し、Control.Invoke
を呼び出して、そこでデータバインディングを行うことです。
または、BackgroundWorker
を使用します
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, e) => { /* create items */ };
bw.RunWorkerCompleted += (s, e) => { /* databind UI element*/ };
bw.RunWorkerAsync();
別のスレッドからfromのプロパティにアクセスすると、この例外がスローされます。この問題を回避するには、少なくとも2つのオプションがあります。
これらの例外をスローしないようにControlに指示します(推奨されません):
Control.CheckForIllegalCrossThreadCalls = false;
スレッドセーフ機能の使用:
private void ThreadSafeFunction(int intVal, bool boolVal)
{
if (this.InvokeRequired)
{
this.Invoke(
new MethodInvoker(
delegate() { ThreadSafeFunction(intVal, boolVal); }));
}
else
{
//use intval and boolval
}
}