2009-03-05 3 views
0

확인을 클릭하십시오. 더 이상 오류가 발생하지 않습니다. 그래서 내 문제는 차트가 바인딩 된 값을 바꿀 때 차트를 업데이트하는 것입니다.Control.Refresh() 스레드 간

// 아래에서 무시하십시오.

안녕하세요. 패널이있는 WinForms 응용 프로그램이 있습니다 (panel1). 배경 스레드는 너무

panel1.Controls.AddRange(myArrayOfControls); 

이 잘 작동하고 내 컨트롤이 추가됩니다 볼 수 있습니다처럼 panel1에 추가됩니다 다른 컨트롤을 만듭니다. 그러나 다른 스레드에서 새 데이터가 들어 오면 컨트롤의 부모 개체에있는 값을 업데이트 한 다음 디스플레이가 새 값으로 업데이트되도록하려면 Refresh()이 필요합니다. 컨텍스트, 데이터가 들어오는 스레드 또는 업데이트 된 데이터를받는 개체에서 Refresh()을 호출하면 Invoke가 필요하기 때문에 InvalidOperation 예외가 발생합니다. 내 모델 개체 및 또한 데이터가 들어오는 스레드에서 Invoke를 사용하여 시도하고 오류를 흔들 수없는 것.

누구든지 몇 가지 지침이 있다면 크게 감사하겠습니다.

업데이트 : 여기 조금 더 자세한 정보가 있습니다. 나는 그것을 요구할 것이라고 생각하지 않았지만 나는 틀렸다. :)

나는 개체 클래스 MyObject 있습니다. 이 MyObject 클래스는 topologyThread라는 스레드에서 생성됩니다. dataThread에 데이터가 들어옵니다. MyObject의 인스턴스에는 Panel 인스턴스 변수가 있으며 Panel에는 System.Windows.Forms.DataVisualization.Charting 네임 스페이스의 두 차트를 비롯한 하위 컨트롤이 있습니다. 따라서 dataThread에 데이터가 들어 오면 MyObject 객체의 각 데이터 값을 업데이트 한 다음 차트를 새로 고쳐 업데이트 된 데이터를 표시해야합니다.

데이터가 잘 처리된다는 것을 알고 있습니다. 내 MyObject 클래스에서 속성에 대한 setter의 Console에 새 값을 기록하고 새 값이 표시되는지 확인합니다.

답변

6

기본 UI 스레드에서 두 작업 (컨트롤의 부모 개체 새로 고침 및 업데이트)을 수행해야합니다. 백그라운드 스레드에서 컨트롤을 수정하는 중이고 오류가 발생했기 때문에 불운 한 예외가 발생하지 않습니다.

이 작업을 수행하는 가장 좋은 방법은 업데이트가 수행하는 방법의 샘플이있는 경우

theControl.Invoke(new MethodInvoker(MyUpdateMethod)); 

을 사용하는 것입니다, 우리는 제대로 백그라운드 스레드에서 호출하는 방법에 대한 더 나은 샘플을 제공 할 수 있습니다.

0

JaredPar의 답변이 좋습니다. 어떤 경우에는 문제가 발생할 수 있습니다 (특히 양식 작성이 완료되기 전에 메소드가 호출 될 때).

InvokeOnHostThread(() => panel1.Controls.AddRange(myArrayOfControls)); 
1

JaredPar는 : 여기 지금

public static class ControlInvokeExtensions 
{ 
    public static void InvokeOnHostThread(Control host, MethodInvoker method) 
    { 
     if (IsHandleCreated) 
      Invoke(new EventHandler(delegate { method(); })); 
     else 
      method(); 
    } 
} 

당신은 양식에 있다면

panel1.InvokeOnHostThread(() => panel1.Controls.AddRange(myArrayOfControls)); 

이 나이 방법으로 호출 할 수 있습니다 (확장 방법을 사용하여) 좀 더 강력한 구현입니다 꽤 좋은 대답. 나는 당신의 코드가 작동하는 이유에 관해서 조금 더하고 싶다.

Windows 양식을 사용하면 다른 스레드에서 UI 스레드와 대화 할 수 있습니다. 이것은 모든 경우에있어서 정말 나쁜 습관입니다.

캐치 (catch)는 때로는 UI가 아무 문제가없는 것처럼 작동하기 때문에 잡기가 어렵습니다. 항목이 추가되거나 변경되고 UI에 변경 사항이 반영됩니다. 그러나 동일한 시간대에 똑같은 코드가 실행되는 경우에는 작동하지 않습니다.

UI 스레드가 아닌 다른 스레드에서 UI를 만지는 것은 잡기입니다. 밖에서 와서는 일관성이 없기 때문에 그것이 매우 나쁜 습관입니다.

신 나는 내가 말할 수 있으면 좋겠다. :)

+1

+1, 지금 당신은 10 명의 담당자에게 더 말할 수있는 것에 가깝습니다. :) –

관련 문제