テキストボックスとボタンのあるフォームがあります。ボタンをクリックすると、スレッドを作成し、何らかの操作のためにそれを呼び出します。スレッドが呼び出されたタスクを完了したら、テキスト ボックスを結果で更新したいと考えています。
スレッドの衝突なしでこれを達成する方法を教えてください。
テキストボックスとボタンのあるフォームがあります。ボタンをクリックすると、スレッドを作成し、何らかの操作のためにそれを呼び出します。スレッドが呼び出されたタスクを完了したら、テキスト ボックスを結果で更新したいと考えています。
スレッドの衝突なしでこれを達成する方法を教えてください。
.NET 4.0 のTask
クラスを使用すると、これははるかに簡単になります。
private void button_Click(object sender, EventArgs e)
{
Task.Factory.StartNew( () =>
{
return DoSomeOperation();
}).ContinueWith(t =>
{
var result = t.Result;
this.textBox.Text = result.ToString(); // Set your text box
}, TaskScheduler.FromCurrentSynchronizationContext());
}
.NET 4.5 を使用している場合は、新しい非同期サポートを使用してこれをさらに簡素化できます。
private async void button_Click(object sender, EventArgs e)
{
var result = await Task.Run( () =>
{
// This runs on a ThreadPool thread
return DoSomeOperation();
});
this.textBox.Text = result.ToString();
}
Control.Invoke
独自のスレッドでフォームを操作するために使用する必要があります。
簡単に言えば、スレッド操作の最後に:
/// ... your code here
string newText = ...
textBox.Invoke((MethodInvoker) delegate {
textBox.Text = newText;
});
このControl.Invoke
使用法では、メッセージ キューを使用して作業を UI スレッドに渡します。したがって、textBox.Text = newText;
行を実行するのは UI スレッドです。
を使用しBackgroundWorker
てタスクをイベントに割り当て、DoWork
テキスト ボックスをイベントで更新しますRunWorkerCompleted
。その後、 でタスクを開始できますRunWorkerAsync()
。