我有一个用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 :(得分:2)
您需要找到解决问题范围的策略。
尝试在调试器外部加载发布版本以获得速度的真实指示。调试版本中的延迟或在调试器下运行时通常不会在发行版中出现。
通过单独尝试部分代码来减少问题 - 例如注释掉互斥锁以查看问题是否正在加载dll或启动逻辑。
加入一些跟踪来告诉你程序正在做什么。在每个跟踪上,转储出Environment.TickCount,这样你就可以计算出哪些代码占用了时间。
长时间延迟,特别是30秒的倍数,通常是由于资源超时 - 是通过网络连接或类似网络访问的任何东西,可能会很慢我们不可用?它可能就像当前目录设置在某个地方一样简单无助,因此打开当前目录中的跟踪文件是拖延 - 尝试完整路径而不是'./'