Приложение занимает много времени при запуске - PullRequest
0 голосов
/ 24 декабря 2011

У меня есть приложение для Windows, написанное на C #, которое занимает много времени при запуске. Время ввода метода 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>

Main:

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 Ответ

2 голосов
/ 24 декабря 2011

Вам нужно найти стратегии, чтобы сузить проблему.

Попробуйте загрузить сборку релиза вне отладчика, чтобы получить реальное представление о скорости. Часто задержки в отладочных версиях или при работе под отладчиком отсутствуют в выпуске.

Уменьшите проблему, попробовав отдельные части кода - например, Закомментируйте мьютекс, чтобы увидеть, является ли проблема загрузкой dll или логики запуска.

Добавьте след, чтобы рассказать, что делает программа. На каждой трассировке выведите Environment.TickCount, чтобы вы могли определить, какой бит кода занимает время.

Длительные задержки, особенно кратные 30 секундам, часто связаны с истечением времени ожидания ресурса - доступ к чему-либо по сетевому соединению или что-либо подобное может замедлить нашу недоступность? Это может быть так же просто, как текущий каталог, установленный где-то бесполезно, поэтому открытие файла трассировки в текущем каталоге останавливается - попробуйте ввести полный путь вместо './'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...