어떤 이유로 ToolStrip의 ProgressBar 및 Label이 다른 스레드에서 업데이트되지 않습니다. 독서를 많이 한 후에도이 문제를 생각해 냈지만 여전히 작동하지는 않습니다 (버튼은 정상이지만 상태 표시 줄에는 없습니다).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()와 함께 사용되었습니다. 이제 CAN 버튼을 업데이트 할 수 있지만 상태 표시 줄의 모든 컨트롤은 업데이트 할 수 없습니다.
희망 사항이 더 분명합니다.
.NET 3.5, VS2008, Winforms를 사용합니다. 어떤 해결책이 있습니까?
귀하의 플랫폼은 무엇입니까? winforms? wpf? webforms? 적절하게 태그하십시오. –
조건을 부릅니까? 나는 그것이 이상한 질문이라는 것을 알고 있지만, 전체 기능을 보지 못했기 때문에 이미 호출하고 있거나 어떤 이유로 든 필요하지 않습니다 ... 버튼이 항상 작동한다고합니다 - InvokeRequired에 대해 버튼이 선택되어 있지 않습니다. .. 깨진 2 개가 있습니다. – Aaron
Aaron이 (가) 아마도 귀하의 질문에 답변했습니다. 난 그냥 추가하고 싶습니다, 당신은 별도로 모든 컨트롤을 호출 할 필요가 없습니다. 호출은 컨트롤이 작성된 것과 동일한 스레드에서 포함 코드가 실행되도록합니다. 컨트롤을 이름으로 참조하여 폼 내부에있을 가능성이 높고 폼 또한 컨트롤이기 때문에 하나의'this.Invoke (...) '로 단순화하고 거기에 모든 GUI 업데이트 코드를 넣을 수 있습니다. – Fixation