2011-12-24 30 views
0

C#で書かれたWindowsアプリケーションを起動しているうちに、起動に時間がかかります。 Main()メソッドに入る時間は1分以上です。以下のアセンブリは、私のプロジェクトで使用されている:起動時に長い時間がかかるアプリケーション

<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 (またはメインへの入り口が何であれ)と呼ばれていますか? –

+0

main()に更新されたコードがあります。 – user186246

+2

アプリケーションをプロファイルすることができます。 –

答えて

2

問題を絞り込むための戦略を見つける必要があります。

デバッガの外にリリースビルドを読み込んで、実際の速度を表示してみてください。多くの場合、デバッグバージョンの遅延やデバッガ下での実行はリリースには存在しません。

コードの一部を分離して試してみてください。ミューテックスをコメントアウトして、問題がdllまたは起動ロジックをロードしているかどうかを確認します。

プログラムが何をしているかを伝えるために、いくつかのトレースを入れてください。各トレースで、Environment.TickCountをダンプして、時間のかかるコードを調べてください。

長い遅延、特に30秒の倍数は、多くの場合、リソースのタイムアウトによるものです - ネットワーク接続などでアクセスされているものがあり、使用できなくなる可能性がありますか?現在のディレクトリが役に立たないように簡単に設定できるので、現在のディレクトリのトレースファイルを開くことはストールしています。 './'の代わりにフルパスを入力してください。

+0

私はいくつかのトレースステートメントを追加し、main()に入る前に遅延が確認されていることに気付きました。 – user186246

+0

空のMain()関数があればどうなりますか?遅いロード時間はまだ見えますか? –

関連する問題