2010-12-02 2 views
2

내 .net 응용 프로그램에서 DataBindings를 사용하고 있으며 보조 스레드에서 일부 UI 값을 업데이트하는 위치가 있습니다. 따라서 예외없이 GUI 작업을 수행하려면 기본 UI 스레드를 호출해야합니다..net 2.0을위한 Dispatcher.Invoke analog

in .net 3 세계 내가 말할 수있는 Dispatcher.CurrentDispatcher.Invoke(()=>{ /* update UI here */});하지만 지금은 .net 2.0에서만 작업하고 있습니다.

나는 어떤 gui 제어도 Control.Invoke를 수행 할 수있는 권한이 없습니다. 그렇다면 어떻게 안전하게 UI를 업데이트 할 수 있습니까?

답변

2

어쩌면 Application.OpenForms[0].Invoke?

+0

감사합니다. 나는 확실하지 않다, 그것은 무엇인가이다 :) 그 앱에 의해 만들어진 첫 번째 형태인가? 그것이 이미 처분 되었다면 ... .. – Shaddix

+0

이것은 현재 열려있는 양식입니다. 주요 양식 일 필요는 없습니다. 따라서 기본 UI 스레드와 다른 스레드에서 새 창을 만드는 경우 문제가 발생할 수 있습니다. – Botz3000

0

동일한 작업을 수행하는 데 도움이되는 디자인 패턴을 선택해야합니다.

양식 (또는 해당 개체)에 대한 액세스 권한이있는 클래스는 작업을 양식에 위임 할 때 사용해야합니다. 이 클래스는 스레드에 의해 사용될 수 있습니다 (모두 동기화되었는지 확인하십시오).

편집 :

This 당신을 너무 관심을 가질만한!

+0

현재 메인 양식에 대한 정적 참조를 사용하고 있으므로 귀하가 조언 한 것처럼 보입니다. 그것은 작동하지만 디스패처 훨씬 청소기 .. 생각, 거기에 비슷한. NET 2.0. 안타깝게도 아무 것도 없다고 생각합니다. ( – Shaddix

3

.NET 2.0 및 Windows Forms에서는 컨트롤의 BeginInvoke/EndInvoke 메서드를 사용해야 백그라운드 스레드에서 UI를 업데이트 할 수 있습니다.

public delegate void InvokeDelegate(); 

private void Invoke_Click(object sender, EventArgs e) 
{ 
    myTextBox.BeginInvoke(new InvokeDelegate(InvokeMethod)); 
} 
public void InvokeMethod() 
{ 
    myTextBox.Text = "Executed the given delegate"; 
} 
+0

'나는 어떤 GUI 제어도 Control.Invoke에 액세스 할 수 없습니다. '예, 그 방법은 알고 있지만 쉽게 제어 할 수는 없습니다. – Shaddix

+0

@Shaddix : 그렇지 않으면 GUI 컨트롤을 가지고 있다면 어떤 UI를 업데이트 할 것인가? –

+0

나는 UI를 가지고 있는데, 나는 그것을 업데이트 할 시점에서 아무런 접근이 없다. 나는 DataBindings와 TextBox.Text 속성을 사용하는데 someClass에 바인딩되어있다. Text 속성이므로 someClass.Text를 변경하면 UI가 자동으로 업데이트되고 someClass에는 UI에 대한 액세스가 전혀 없습니다. – Shaddix

0

나는 항상

If (control.InvokeRequired) 
{ 
    control.Invoke([This method], params); 
    return; 
} 

로 시작하는 방법을 만든 다음 UI에서 실행하는 데 필요한 것을 실행이 필요가,이 방법 :

MSDN은 following sample있다 이 메서드를 호출하면 UI 스레드에서 실행됩니다.

3

모두 같은 대답입니다. ui 컨트롤 (메인 스레드에서 항상 실행되는 컨트롤)에 대한 인스턴스 참조를 가져 와서 아직 있는지 확인하고 주 스레드에서 실행할 코드를 호출하게합니다. Stupid .NET 2.0,하지만 작동합니다. 코드가 양식 상인 경우 다음을 사용할 수도 있습니다.

BeginInvoke((ThreadStart)delegate{your.code.here();even.more.code.here();});