異なるスレッドからのコントロールのプロパティを変更するために呼び出しを使用しての安価な、最小限の例です。
public void F_Thread()
{
for (int i = 0; i < Convert.ToInt16(textBox1.Text); i++)
{
if (pictureBox1.InvokeRequired)
this.Invoke(new UpdatePBInvoker(UpdatePB), -10);
Thread.Sleep(100);
}
}
delegate void UpdatePBInvoker(int moveX);
private void UpdatePB(int moveX)
{
pictureBox1.Left = pictureBox1.Left + moveX;
}
は、より多くのパラメータを追加すること自由に感じなさい。ただ機能とデリゲート同じの署名を維持することを確認してください:チェックif (someControl.InvokeRequired)
はオプションであり、多くの場合、可能にするために追加
.. this.Invoke(new UpdatePBInvoker(UpdatePB), pictureBox1, -10);
注:
delegate void UpdatePBInvoker(Control ctl, int moveX);
private void UpdatePB(Control ctl, int moveX)
{
ctl.Left = ctl.Left + moveX;
}
は、このような第二のバージョンを呼び出します異なるスレッドから関数を呼び出さないという選択肢。論文のケースのために1は、通常は直接呼び出してelse
ブランチを追加します。UpdatePB(...)
はまた、あなたは、フォームを閉じたときに、スレッドがまだを実行することができることに注意してください。エラーは多分このように、それを中止することを確認しないようにするには:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if ((th!= null && th.IsAlive) th.Abort();
}
あなたのスレッドは、特にロックをaquiring、より複雑なことをするだろう場合は、は中止されましたが終了するチャンスと密接与えられるべきではありませんグローバルフラグを設定することにより、usuallyになります。しかし、この場合は正常に動作するはずです。このトピックのMSDNも参照してください。
出典
2016-05-17 15:47:40
TaW
UIでスレッドを使用することはできません。タイマーまたは 'await'を使用してください。 – SLaks
UIスレッドの外側からUI要素を操作しようとすると、Invokeを使用して行う必要があります。 – TaW
あなたのコメントありがとう、私はタイマーでそれを試したが、私はスレッドでこれを書く必要があります!私はそれをどのように書くことができるか知っていますか? – Sarah