2010-11-03 97 views
1

我有一個C#應用程序,當我在加載主窗口之前使用啓動畫面時,遇到多線程/背景工作時遇到麻煩。啓動畫面+主窗口

我的代碼看起來是這樣的:

[STAThread] 
private static void Main() 
{ 

.. do some stuff 

ShowSplash(); // where i show a splash screen and load some stuff 

... 

由於ShowSplash最後一步,我做了以下內容:

new MyCabApplication<MyMainWorkItem, MDIParentForm>().Run(); -- where i load the form through cab. 

的問題是,當我這樣做,我得到下面的異常:

在單個線程上啓動第二個消息循環不是有效的操作。使用Form.ShowDialog代替

任何想法我能做些什麼?

這裏是我的showsplash功能:

private static DialogResult ShowSplash(AutoResetEvent controller) 
{ 
    // create and register splash screen 
    splashScreen = new PointSplashScreen(); 
    Application.Run(splashScreen); 
    return DialogResult.OK; 
} 
+0

在示例中包含線程和後臺工作者代碼。 – 2010-11-03 21:34:01

+1

按照異常消息中的建議。 – 2010-11-03 21:36:53

+0

由於顯示啓動畫面時出現問題,因此應該發佈'ShowSplash()'的實現,以便我們可以更好地瞭解它如何最終啓動第二個消息循環。 – 2010-11-03 21:36:54

回答

1

這聽起來像MyCabApplication延伸ApplicationRun方法通過啓動處理窗口消息的消息循環來啓動WinForm應用程序。

由於您已經顯示UI,因此已經有一個消息循環運行,因此您無法啓動另一個循環。爲了讓您的主要形式展現出來,使得它的一個新的實例,並調用Show()

var form = new MainForm(); 
form.Show(); 
+0

你的意思是?但是CAB最後用MDIParentForm()做了什麼 – 2010-11-04 13:23:12

2

兩個解決方案:

  1. 而不是使用Application.Run,只需創建窗體的新實例,然後請致電ShowDialog。撥打ShowDialog()後,在啓動屏幕外移動new MyCabApplication<MyMainWorkItem, MDIParentForm>().Run();。如果不能始終運行此代碼,則可以檢查啓動屏幕的屬性。
  2. 代替使用Application.Run(Form),請使用Application.Run(ApplicationContext)。您需要創建一個新的ApplicationContext並將您的代碼移到那裏。

解決方案1更容易。