2011-08-10 29 views
0

上下文時:的NullReferenceException關閉螺紋形式

我創建了開始之前運行閃屏的Windows窗體應用程序。很快,這裏是包含了我Program.cs

public static Thread splashScreenThread = null; 
public static FormSplashScreen formSplashScreen; 

[STAThread] 
static void Main(string[] args) { 

    // Show splash screen 
    splashScreenThread = new Thread(new ThreadStart(ShowSplashScreen)); 
    splashScreenThread.IsBackground = true; 
    splashScreenThread.Start(); 

    // Load some components in background 
    LoadComponentsInBackground() 

    // Hide the splash screen 
    if (splashScreenThread != null) { 
     formSplashScreen.Invoke(new MethodInvoker(delegate { 
      formSplashScreen.Close(); 
      formSplashScreen.Dispose(); 
     })); 
     splashScreenThread = null; 
    } 

    // Start now the application 
    Application.Run(); 
} 

private static void ShowSplashScreen() { 
    formSplashScreen = new FormSplashScreen(); 
    formSplashScreen.ShowDialog(); 
} 

問題:

我的問題不會發生,每次我啓動應用程序,它似乎是隨機的,更經常發生在一些電腦和少別人......所以我有點糊塗了,況且我真的不明白它從何而來:

一個NullReferenceExceptionformSplashScreen.Invoke(...Close...)線升高,但formSplashScreen正確初始化(我檢查調試時) 。
我不知道這是否是來自該線程或從另一點...

可能的解決辦法:

我也許可以環繞線的東西,如低於造成的問題,但它不僅會繞開這個問題,我寧願理解它並妥善解決它。

while (splashScreenThread != null) { 
    try { 
     formSplashScreen.Invoke(new MethodInvoker(delegate { 
      formSplashScreen.Close(); 
      formSplashScreen.Dispose(); 
     })); 
     splashScreenThread = null; 
    } catch (Exception e) { 

    } 
} 
+0

聽起來像競賽條件..嘗試將此代碼移到「ShowSplashScreen」方法中。 –

回答

2

這是一個競態條件,發生的原因是線程已創建並聲明,但SplashScreen尚未創建。

換句話說,您正試圖在啓動畫面被創建之前關閉它。

您可以使用EventWaitHandle來確保已創建SplashScreen或至少等到它不爲空。

另一種選擇是發出信號指示屏幕應該關閉並讓他處理關閉邏輯。

+0

_「等待事件」_是什麼意思? – Otiel

+0

EventWaitHandle http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle.aspx –