2011-02-18 3 views
0

다중 양식 .NetCF 3.5 응용 프로그램에서 사용자가 이전 양식을 사용하는 동안 백그라운드에서 양식을 만들려고합니다. 우리는 우리는 래퍼 클래스 (FormController)를 사용하여 프로젝트OAC를 사용하여 .netCF의 다른 (백그라운드) 스레드에서 생성 된 양식을 표시하려고 할 때 예외가 발생했습니다.

에 방향 인식 제어를 사용하는 우리의 응용 프로그램에서 다른 형태의 정적 참조를 유지하기 위해 (내가 잘못된 용어를 사용하고 있으면 알려 주시기 바랍니다). 우리는 단지 한 번만 만들고 싶기 때문입니다.

양식이 처음 사용될 때 작성됩니다. 2,146,233,067하고 가치있는 다른 : 이것은 시간이 소요 작업이기 때문에 내가 GotoSecForm()를 호출 할 때 사용자

Application.Run(new FormController.StartUI()); 

class FormController{ 

private static object lockObj = new object(); 
private static bool secIsLoaded = false; 

private static StartForm startForm = new StartForm(); 
private static SecForm m_SecForm; 
static SecForm FormWorkOrderList 
{ 
    get 
    { 
      CreateSecForm(); 
      return m_SecForm; 
     } 
    } 


private static void StartUI(){ 

    startForm.Show(); 

    ThreadStart tsSecForm = CreateSecForm; 
    Thread trSecForm = new Thread(tsSecForm); 
    trSecForm.Priority = ThreadPriority.BelowNormal; 
    trSecForm.IsBackground = true; 
    trSecForm.Start(); 
    return startForm; 
} 

private static void CreateSecForm() 
{ 
    Monitor.Enter(lockObj); 
    if(!secIsLoaded){ 
     m_SecForm = new SecForm(); 
     secIsLoaded = true; 
    } 
    Monitor.Exit(lockObj); 
} 

private static void GotoSecForm() 
{ 
    SecForm.Show(); 
    StartForm.Hide(); 
} 

프로그램이 HRESULT과 exection와 SecForm.Show()상의 excepton을 발생하면서 그러나 우리는 백그라운드에서이 작업을 수행하고 싶습니다 정보.

이 예외의 스택 트레이스는 다음과 같습니다

on Microsoft.AGL.Common.MISC.HandleAr(PAL_ERROR ar) 
on System.Windows.Forms.Control.SuspendLayout() 
on b..ctor(OrientationAwareControl control) 
on Clarius.UI.OrientationAwareControl.ApplyResources(CultureInfo cultureInfo, Boolean skipThis) 
on Clarius.UI.OrientationAwareControl.ApplyResources() 
on Clarius.UI.OrientationAwareControl.OnLoad(EventArgs e) 
on Clarius.UI.OrientationAwareControl.c(Object , EventArgs) 
on System.Windows.Forms.Form.OnLoad(EventArgs e) 
on System.Windows.Forms.Form._SetVisibleNotify(Boolean fVis) 
on System.Windows.Forms.Control.set_Visible(Boolean value) 
on System.Windows.Forms.Control.Show() 

내가 잘못 여기에 무슨 일이 일어나고 있는지에 대해 매우 qlueless입니다. 누구든지 나를 도울 수 있습니까?

백그라운드에서 양식을로드하는 데 더 좋은 방법이 있습니까?

추가 정보가 필요하면 알려주세요.

답변

2

백그라운드 스레드에서 양식을 만들거나 컨트롤이나 양식을 안전하게 조작 할 수 없습니다. 메시지 펌프가 실행되는 스레드와 동일한 스레드 (Windows Forms가 작동하는 방식)에서 만들어야합니다.

양식 자체를 작성하는 것은 비용이 많이 드는 작업이 아니어야합니다. 내 조언은 백그라운드 스레드에 양식을 표시하는 데 필요한 값 비싼 계산을 수행 한 다음 해당 계산 결과를 다시 주 메시지 펌프로 전달하여 양식 자체를 작성하고 표시하는 것입니다.

입력에 대한

+0

감사합니다 (이 글을 쓰는 통해 절반 방법은 그러나 나는 내가 위는 여전히이 상황에서 적용되는 99 % 확신,이 질문은 윈도우 모바일에 관한 것을 깨달았다)! 나는 이것을 시험해보고 나의 발견과 함께 여기로 돌아갈 것이다. –

+1

WinMo에서도 동일한 규칙이 적용되므로 제안 사항이 100 % 유효합니다. – ctacke

관련 문제