2

テキストボックスとボタンのあるフォームがあります。ボタンをクリックすると、スレッドを作成し、何らかの操作のためにそれを呼び出します。スレッドが呼び出されたタスクを完了したら、テキスト ボックスを結果で更新したいと考えています。

スレッドの衝突なしでこれを達成する方法を教えてください。

4

5 に答える 5

3

.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();
}
于 2012-12-22T22:37:35.520 に答える
0

Control.Invoke独自のスレッドでフォームを操作するために使用する必要があります。

于 2012-12-22T22:38:16.010 に答える
0

簡単に言えば、スレッド操作の最後に:

/// ... your code here
string newText = ...

textBox.Invoke((MethodInvoker) delegate {
    textBox.Text = newText;
});

このControl.Invoke使用法では、メッセージ キューを使用して作業を UI スレッドに渡します。したがって、textBox.Text = newText;行を実行するのは UI スレッドです。

于 2012-12-22T22:38:44.110 に答える
0

を使用しBackgroundWorkerてタスクをイベントに割り当て、DoWorkテキスト ボックスをイベントで更新しますRunWorkerCompleted。その後、 でタスクを開始できますRunWorkerAsync()

于 2012-12-22T22:39:16.563 に答える
0

ここに示すソリューションを使用できます。

C#で別のスレッドからGUIを更新するには?

次回は質問する前に少し検索してみてください。

于 2012-12-22T22:39:38.460 に答える