2011-12-24 118 views
0

我有一個用C#編寫的Windows應用程序,啓動時需要很長時間。輸入Main()方法的時間超過一分鐘。以下組件在我的項目中使用:應用程序在啓動過程中需要很長時間

<Reference Include="PresentationCore"> 
    <RequiredTargetFramework>3.0</RequiredTargetFramework> 
</Reference> 
<Reference Include="PresentationFramework"> 
    <RequiredTargetFramework>3.0</RequiredTargetFramework> 
</Reference> 
<Reference Include="System" /> 
<Reference Include="System.Core"> 
    <RequiredTargetFramework>3.5</RequiredTargetFramework> 
</Reference> 
<Reference Include="System.Data.DataSetExtensions"> 
    <RequiredTargetFramework>3.5</RequiredTargetFramework> 
</Reference> 
<Reference Include="System.Data" /> 
<Reference Include="System.Deployment" /> 
<Reference Include="System.Drawing" /> 
<Reference Include="System.Windows.Forms" /> 
<Reference Include="UIAutomationProvider"> 
    <RequiredTargetFramework>3.0</RequiredTargetFramework> 
</Reference> 
<Reference Include="WindowsBase"> 
    <RequiredTargetFramework>3.0</RequiredTargetFramework> 
</Reference> 
<Reference Include="WindowsFormsIntegration"> 
    <RequiredTargetFramework>3.0</RequiredTargetFramework> 
</Reference> 

主營:

static class AppMain 
{ 
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool SetForegroundWindow(IntPtr hWnd); 

    [STAThread] 
    static void Main() 
    { 
     bool bCreatedNew = true; 

     using (new System.Threading.Mutex(true, "AppMutex", out bCreatedNew)) 
     { 
      if (bCreatedNew) 
      { 
       TextWriterTraceListener traceListener = new TextWriterTraceListener(File.AppendText("./applog.txt")); 
       Trace.Listeners.Add(traceListener); 
       Trace.AutoFlush = true; 

       Application.EnableVisualStyles(); 
       Application.SetCompatibleTextRenderingDefault(false); 

       Application.Run(new MainForm()); 
      } 
      else 
      { 
       Process currentProcess = Process.GetCurrentProcess(); 
       foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName)) 
       { 
        if (process.Id != currentProcess.Id) 
        { 
         if (SetForegroundWindow(process.MainWindowHandle) == false) 
          MessageBox.Show("Failed to set to foreground..", "Warming", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
         break; 
        } 
       } 
      } 
     } 
    } 

我怎麼能解決這個問題?

+0

有很多設置的Application.Run之前正在做的 - 爲被設置當前目錄裏無益所以打開跟蹤文件在當前目錄停滯不前它可以像簡單被稱爲(或者你的主入口是什麼)? – 2011-12-24 06:40:25

+0

請在main()中找到更新的代碼。 – user186246 2011-12-24 06:53:58

+2

您可以剖析應用程序。 – 2011-12-24 06:55:50

回答

2

您需要找到縮小問題的策略。

嘗試在調試器外加載發佈版本以獲得速度的真實指示。在調試版本中運行時或在調試器下運行時,延遲通常不在發佈中。

通過單獨嘗試部分代碼來減少問題 - 例如,註釋掉互斥鎖,看看問題是否加載了dll或啓動邏輯。

把一些跟蹤在告訴你什麼程序在做什麼。在每個跟蹤中,轉儲出Environment.TickCount,以便確定哪一部分代碼需要花費時間。

長時間的延遲,特別是30秒的倍數,通常是由於資源超時 - 通過網絡連接被訪問或類似的可能被延緩我們的不可用什麼?嘗試完整路徑,而不是「./」

+0

我添加了一些跟蹤語句,並注意到在進入main()之前觀察到了延遲。 – user186246 2011-12-24 13:48:59

+0

如果您有一個空的Main()函數,該怎麼辦?你仍然看到緩慢的加載時間? – 2011-12-25 00:54:33

相關問題