何らかの理由で、ToolStripのProgressBarとLabelが他のスレッドから更新されません。多くの読書の後、私はこれを考え出しましたが、まだ動作していません(しかし、ボタンはOKですが、ステータスバーにはありません)。C#Toolstripのプログレスバーとラベルがクロススレッド操作から更新されない
public void GdmReaderMessageEvent(object sender, GdmMessagesEventArgs e)
{
Console.WriteLine(e.Message);
// error or abort
if (e.Message.StartsWith("Error:") || e.Message.StartsWith("Aborted"))
{
// cross thread crap
if (pb.GetCurrentParent().InvokeRequired)
pb.GetCurrentParent().Invoke(new MethodInvoker(delegate { pb.Visible = false; }));
if (lblStatus.GetCurrentParent().InvokeRequired)
lblStatus.GetCurrentParent().Invoke(new MethodInvoker(delegate { lblStatus.Text = e.Message; }));
btnImport.Invoke(new MethodInvoker(delegate { btnImport.Text = "Import"; }));
//lblStatus.Text = e.Message;
//btnImport.Text = "Import";
//pb.Visible = false;
}
}
編集、現在すべての機能が、これはBGWのスレッドからわずかのコールバックですが、私はそれはすでに明らかだと思いました。私がちょうどそれを使用する場合:
lblStatus.Text = e.Message; // this is a Label inside Status
btnImport.Text = "Import"; // this is just a button on Form
pb.Visible = false; // this is a Progress Bar inside Status
クロススレッドエラーがスローされます。だからこそ私はInvoke()で使用しました。 今すぐボタンを更新できますが、ステータスバーのすべてのコントロールは更新されません。
希望がより明確になりました。
.NET 3.5、VS2008、Winformsを使用します。 どのような解決策ですか?
あなたのプラットフォームは何ですか? winforms? wpf?ウェブフォーム?適切にタグを付けてください –
条件を満たしていますか?私はそれが奇妙な質問だと知っていますが、私は全体の機能を見ないので、おそらくあなたはすでに呼び出しているか、何らかの理由で必須ではありません...ボタンは常に動作しています - InvokeRequiredのボタンはチェックされません。 .. 2つは壊れています。 – Aaron
あなたの質問にAaronがおそらく答えました。私はちょうど追加したいと思う、あなたは別々にすべてのコントロールを呼び出す必要はありません。呼び出しは、コントロールが作成されたのと同じスレッドでコードが実行されていることを確認します。あなたのコントロールを名前で参照して、フォームの中にある可能性が最も高いので、フォームもコントロールです。そのため、単一の 'this.Invoke(...)'に簡略化し、すべてのGUI更新コードをそこに配置することができます。 – Fixation