启动时应用程序需要很长时间

时间:2011-12-24 06:36:45

标签: c# .net wpf winforms startup

我有一个用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;
                    }
                }
            }
        }
    }

我怎么能克服这个问题?

1 个答案:

答案 0 :(得分:2)

您需要找到解决问题范围的策略。

尝试在调试器外部加载发布版本以获得速度的真实指示。调试版本中的延迟或在调试器下运行时通常不会在发行版中出现。

通过单独尝试部分代码来减少问题 - 例如注释掉互斥锁以查看问题是否正在加载dll或启动逻辑。

加入一些跟踪来告诉你程序正在做什么。在每个跟踪上,转储出Environment.TickCount,这样你就可以计算出哪些代码占用了时间。

长时间延迟,特别是30秒的倍数,通常是由于资源超时 - 是通过网络连接或类似网络访问的任何东西,可能会很慢我们不可用?它可能就像当前目录设置在某个地方一样简单无助,因此打开当前目录中的跟踪文件是拖延 - 尝试完整路径而不是'./'