Process.Start有时需要很长时间才能回来

时间:2011-03-22 22:37:40

标签: c# multithreading visual-studio-2010 .net-2.0

我在写作的应用程序中遇到了一个奇怪的问题。

它读取主xml配置文件,为用户创建本地副本,然后执行xml文件中列出的某些操作。它会检查本地xml文件是否需要更新,因此不需要每次都进行更新。

每个操作都在一个新线程中运行,一旦所有线程完成,它就会写一个日志并告知用户它已完成。

其中一个操作是将.reg文件导入注册表。我这样做是这样的:

Process regeditProcess = Process.Start("regedit.exe", "/s " + RegFilePath);
regeditProcess.WaitForExit();
regeditProcess.Close();

我遇到的问题是,如果应用程序创建了一个新的配置文件,那么regedit进程可能需要长达30秒的时间。如果它没有创建一个,那么它会在一秒钟内完成。

在检查线程的循环中,我已经放了一个

Application.DoEvents();

如果我不这样做,regedit进程将运行,如果我等待足够长的时间,我会从调试器中检测到ContextSwitchDeadlock错误。我尝试过使用不同的.reg文件,只运行这一个动作,但仍然是相同的。

在尝试任何操作之前,xml文件的创建发生在主工作线程中,但我确定这会对它产生一些影响,我只是不确定是什么。

我知道这有点奇怪,但是之前有人打过这样的事吗?

2 个答案:

答案 0 :(得分:0)

您是否在创建配置文件后明确关闭文件编写器对象?如果没有,您可能会锁定文件,阻止您的工作人员访问。

答案 1 :(得分:0)

我已经解决了问题所在,我在Program.cs中有了STAThread指令。一旦我把它拿出来,它就会得到一种享受。

STAThread and multithreading

http://ilvyanyatka.spaces.live.com/blog/cns!EA0C02AB2E2FCFAC!193.entry?wa=wsignin1.0&sa=143328961