2017-11-12 21 views
0

私が行って番号方式並列処理でWindowsフォームのテキストボックスのテキストを設定する方法は?

 private void btnStart_Click(object sender, EventArgs e) 
     { 
      AppendTextBox(DateTime.Now.ToString("HH:mm:ss") + @" <<<Start>>>"); 
      _isStop = false; 
      Parallel.Invoke(
        () => GetCheapestFlightGeshm(), 
        () => GetCheapestFlightAbadan(), 
        () => GetCheapestFlightKermanshah(), 
        () => GetCheapestFlightBandarAbbas() 
        ); 
      AppendTextBox(DateTime.Now.ToString("HH:mm:ss") + @" <<<End>>>"); 
     } 
------------------------------------------------------ 
public void AppendTextBox(string value) 
     { 
      if (this.InvokeRequired) 
      { 
       this.Invoke(new Action<string>(AppendTextBox), new object[] { value }); 

      } 
      txtResult.Text += value + "\n"; 
     } 

AppendTextBoxGetCheapestFlightGeshm,GetCheapestFlightAbadan,GetCheapestFlightKermanshah,GetCheapestFlightBandarAbbas方法で呼び出されるメソッドのための並列処理を使用します!

プロジェクトの最初のメッセージをテキストボックスのみで表示すると、私はプロジェクトをデバッグしても例外はありません。 これを解決するには?

+0

私はあなたの問題を把握できませんでした。追加の詳細を入力してください。 – lucky

+0

常にAppendTextBoxメソッドは例外を除いて実行されますが、最初の呼び出しではテキストボックスのテキストのみが割り当てられます – programmer138200

+0

私の一般的な目標は同時に実行される数値メソッドです。 – programmer138200

答えて

0

代わりに、このようなコントロールのテキストを設定する:へtxtResult.Text += value + "\n";

変更を:txtResult.Invoke((Action)(() => txtResult.Text += value + "\n"));あなたは非同期的にあなたは、単にコントロールのText proprtyを設定することにより、UIを変更することはできませんあなたの関数を実行しているので

Invokeメソッドに電話する必要があります。

txtResult.Text += value + "\n"; 

...起動せずにスレッドからラインを:

+0

しかし、彼はすでに 'if(this.InvokeRequired)'ステートメントで 'Invoke()'を呼び出しています!彼がする必要があるのは、 'else'文に' txtResult.Text + = ... '行をラップすることだけで、彼のコードが動作するだけです。あなたの提案された変更は、それが必要であるかどうかを呼び出すように強制します。そうでない場合は時間とシステムリソースを浪費します。そして、彼はすでに彼の 'if'-statementを呼び出しているので、もっと無駄になる_ ** 2回** _が行われます。 –

0

Control.Invoke()コールを使用すると、背景からAppendTextBox()を呼び出すときにも達するスレッドを意味し、メソッドを終了しません。したがって、2回実行する(試行する)ことはできません。これは、バックグラウンドスレッドからtxtResultにアクセスしようとしてから2回目は機能しません。

if (this.InvokeRequired) 
{ 
    this.Invoke(new Action<string>(AppendTextBox), new object[] { value }); 
    //Your problem is here. 
    //Code execution will continue on the next line after the invoke is complete. 
} 
txtResult.Text += value + "\n"; 

どちらかif -statement内return;呼び出しを追加:

if (this.InvokeRequired) 
{ 
    this.Invoke(new Action<string>(AppendTextBox), new object[] { value }); 
    return; //Stop execution of this method. 
} 
txtResult.Text += value + "\n"; 

...またはelse -statementで最後の行をラップ:

if (this.InvokeRequired) 
{ 
    this.Invoke(new Action<string>(AppendTextBox), new object[] { value }); 
} 
else 
{ 
    txtResult.Text += value + "\n"; 
} 

編集:

は、それはあなたの呼び出しが正常に動作していないようで、これを試してみてください。

if (this.InvokeRequired) 
{ 
    this.Invoke((Action)(() => AppendTextBox(value))); 
} 
else 
{ 
    txtResult.Text += value + "\n"; 
} 
+0

あなたのコードは現在動作しませんが、@ ShaiAharoniのコード作業 – programmer138200

+0

@ programmer138200:私の答えを編集しました。彼の答えはうまくいくかもしれませんが、強制的に呼び出すことは悪い習慣です。 –

関連する問題