我整天都在排除故障。在做了一些research以及很多試驗和錯誤之後,似乎我已經能夠縮小問題的範圍,因爲我的電話process.Start()
在定時器線程上不起作用。下面的代碼在主線程上運行時工作。在定時器回調中放入完全相同的代碼,並掛起。爲什麼?我如何使它與計時器一起工作?Process.Start()在後臺線程上運行時掛起
private static void RunProcess()
{
var process = new Process();
process.StartInfo.FileName = "cmd";
process.StartInfo.Arguments = "/c exit";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start(); // code hangs here, when running on background thread
process.StandardOutput.ReadToEnd();
process.WaitForExit();
}
編輯
作爲一個測試,我用另一臺筆記本電腦這種完全相同的代碼,我經歷了同樣的問題。這是可以粘貼到控制檯應用程序中的完整代碼。 process.Start()
掛起,但只要我點擊任何鍵結束,process.Start()
在程序結束前完成。
private static System.Timers.Timer _timer;
private static readonly object _locker = new object();
static void Main(string[] args)
{
ProcessTest();
Console.WriteLine("Press any key to end.");
Console.ReadKey();
}
private static void ProcessTest()
{
Initialize();
}
private static void Initialize()
{
int timerInterval = 2000;
_timer = new System.Timers.Timer(timerInterval);
_timer.Elapsed += new ElapsedEventHandler(OnTimerElapsed);
_timer.Start();
}
private static void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
if (!Monitor.TryEnter(_locker)) { return; } // Don't let multiple threads in here at the same time.
try
{
RunProcess();
}
finally
{
Monitor.Exit(_locker);
}
}
private static void RunProcess()
{
var process = new Process();
process.StartInfo.FileName = "cmd";
process.StartInfo.Arguments = "/c exit";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start(); // ** HANGS HERE **
process.StandardOutput.ReadToEnd();
process.WaitForExit();
}
工作正常,如預期的那樣,應該如此。你需要嘗試這是另一臺機器或沒有加載任何crudware的虛擬機。 – 2013-04-25 02:13:08
crudware以何種方式造成這種情況?任何想法如何識別罪魁禍首? – 2013-04-25 02:24:57
@HansPassant我在另一臺筆記本上重複了這個問題。我已經發布了可以作爲測試運行的完整代碼。這會讓我相信這個問題不是貪污。 (除非我在兩個系統上都有相同的軟件) – 2013-04-25 11:33:58