2009-10-11 3 views
0

다른 폼의 컨트롤의 컨트롤 속성을 설정하는 PropertyGrid가 있습니다. 그러나 "위치"및 "텍스트"와 같은 것들을 위해, 나는 스레딩 문제를 교차시킵니다.C# PropertyGrid 컨트롤을 사용하여 컨트롤 속성 변경 "ThreadSafe"

AllowIlligalCrossThread = true를 사용하지 않고 안전하게 속성을 설정하는 것이 쉬운 방법이 있습니까?

감사합니다.

답변

0

속성을 무시하고 Invoke를 사용하여 속성을 "스레드 안전"방식으로 설정하는 파생 하위 클래스를 만들 수 있습니다.

class DerivedLabel : Label 
{ 

    public override string Text 
    { 
     get 
     { 
      return Invoke(new Func<string>(GetText)) as string; 
     } 
     set 
     { 
      Invoke(new Action<string>(SetText), value); 
     } 
    } 

    private void SetText(string text) 
    { 
     base.Text = text; 
    } 

    private string GetText() 
    { 
     return base.Text; 
    } 

} 

호출()는 당신이 컨트롤을 만든 동일한 스레드에 전달하는 대리자를 실행, 그래서 암시 적으로 스레드 안전합니다. 그러나 서브 클래 싱해야 할 컨트롤이 많으면 많은 작업이 될 수 있습니다.

스레딩 문제가 발생하는 이유를 알아내는 것이 더 나을 것입니다. 두 컨트롤이 동일한 스레드에서 생성되면 (Windows 응용 프로그램의 경우처럼) 이러한 예외가 발생하지 않아야합니다. 어떤 이유로 다른 스레드에 PropertyGrid 양식을 작성하고 있습니까?