ボタンのText
をBackgroundWorker
から変更しています。私は例外がスローされたと思った。それはなぜですか?BackgroundWorkerがUIコンポーネントを変更するのはなぜですか?
なぜCross-thread operation not valid: ... accessed from a thread other than the thread it was created on.
が届かないのですか?
編集:ありがとうございました。
おそらく理由は、UIにThread.Sleep(1000);
があるということでした。
public Form1()
{
InitializeComponent();
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerAsync();
Thread.Sleep(1000);
}
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
button1.Text = "a";
}
しかし、この次のコードは、UIに間接的に影響を与えてもうまく動作することに気付きました。
public partial class Form1 : Form
{
int i;
public Form1()
{
InitializeComponent();
i = 1;
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerAsync();
for (int j = 0; j < 100000000; j++) ;
button1.Text = i.ToString();
}
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
i = 2;
}
}
なぜですか?
ソースコードを表示してください... – Yahia
これはなに? 'for(int j = 0; j <100000000; j ++); (int j = 0; j <100000000; j ++){button1.Text = i.ToString();} } '? – user973511
@Fuex No.このループは、UIスレッドが実行されている間にBGWによって 'i'が変更されていることを証明することです。その 'Text'は' 2'に終わります。 – ispiro