2011-12-24 120 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

相关问题