2011-03-01 2 views
0

CF.NET을 사용하여 스플래시 화면을 만들려고하는데 스레딩 관련 내용이 손실됩니다.Compact Framework의 스플래시 화면

내가 가지고있는 콘솔 프로젝트는 동적으로 (WinForm) 화면 (존재하는 경우 콘솔에 출력)을로드하는 콘솔 프로젝트입니다.

지금 내가 원하는 것은이 양식에 메시지를 보낼 수있는 것입니다 (별도의 스레드에서 실행).

하지만 작동하지 않습니다. 현재 작업 스레드에서 양식을 처리 할 수 ​​없습니다.

// Works but running in the current thread, so is blocking 
// and that's not good 
Assembly assembly = Assembly.LoadFrom("240x320Screens.dll"); 
Form ff = assembly.CreateInstance("Screens.Loader") as Form; 
Application.Run(ff); 
// The form implements this interface too 
((ISplashView)ff).SetStep("Step 1 on 3"); 

이제 스레드 코드 (작동하지 않습니다) :

Thread presenterThread = null; 
Assembly assembly = Assembly.LoadFrom("240x320Screens.dll"); 
Form ff = assembly.CreateInstance("Screens.Loader") as Form; 

presenterThread = new Thread((ThreadStart)(() => 
    { 
     Application.Run(ff); 
    })); 
presenterThread.Start(); 

((ISplashView)ff).SetStep("Step 1 on 3"); 
Thread.Sleep(5000); 
((ISplashView)ff).SetStep("Step 2 on 3"); 
Thread.Sleep(5000); 
((ISplashView)ff).SetStep("Step 3 on 3"); 

// Wait the user close the launcher (allowed in my case) 
if (presenterThread != null) 
    presenterThread.Join(); 

을하지만 예외 :

이 코드는 작동

Control.Invoke이 상호 작용하는 데 사용되어야합니다

컨트롤은 별도의 스레드에서 생성됩니다.

어떻게 해결할 수 있습니까?

감사

에만 메인 UI 스레드가 UI 컨트롤을 업데이트 할 수 있기 때문에 문제가 발생합니다

답변

2

. 이 문제를 해결할 수있는 방법은 컨트롤의 InvokeRequired 속성을 확인하고 대리자를 만들고 컨트롤의 Invoke 메서드를 사용하여 대리자를 실행하는 것입니다.

쉬운 구현은 다음과 같은 정적 확장 메서드를 사용하는 것입니다

당신은 그럼 모든 것이 당신을 위해 처리됩니다처럼 호출하면
public static void InvokeIfRequired<T>(this T control, Action<T> action) where T : Control 
{ 
    if (control.InvokeRequired) 
    { 
     control.Invoke(action, control); 
    } 
    else 
    { 
     action(control); 
    } 
} 

: 내 경우

this.textbox1.InvokeIfRequired(txt => txt.Text = "test"); 
+0

는 조금의 어셈블리에서 델리게이트를 추출해야하기 때문에 더 복잡하지만 솔루션은 여전히 ​​유효합니다. 감사. –