2012-02-28 28 views
8

Tôi có một tệp thực thi, chạy tốt khi chạy nó theo cách thủ công và nó tồn tại như nó cần với đầu ra dự kiến. Nhưng khi tôi chạy nó với phương thức dưới đây, sự kiện Process.Exited không bao giờ bị sa thải. Chú ý rằng tôi đã nhớ lại Process.EnableRaisingEventsProcess.Exited không bao giờ được gọi, mặc dù EnableRaisingEvents được đặt thành true

protected override Result Execute(RunExecutable task) 
{ 
    var process = new Process(); 
    process.StartInfo.Arguments = task.Arguments; 
    process.StartInfo.FileName = task.ExecutablePath; 
    process.StartInfo.CreateNoWindow = true; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.EnableRaisingEvents = true; 

    process.Exited += (sender, args) => 
    { 
     processSync.OnNext(new Result 
     { 
      Success = process.ExitCode == 0, 
      Message = process.StandardOutput.ReadToEnd() 
     }); 
     processSync.OnCompleted(); 
    }; 
    process.Start(); 

    return processSync.First();; 
} 

Vấn đề là như nhau, nếu tôi sử dụng Process.WaitForExit() thay vì mở rộng phản ứng, chờ đợi cho sự kiện thoát.

Ngoài ra, nếu tôi chạy quy trình với một đối số khác, tạo ra một kết quả khác, nó tồn tại tốt.

Dường như có liên quan gì đó đến số process.StartInfo.RedirectStandardOutput = true; kể từ khi tôi tắt tính năng này, nó hoạt động. Nhưng đó có thể chỉ là một triệu chứng của một vấn đề khác.

Bất kỳ trợ giúp nào được đánh giá cao :-)

Trả lời

6

Có một bế tắc trong mã của bạn. 'Đầu ra tiêu chuẩn' chỉ là một loại ống có tên, trong đó có một bộ đệm nhỏ để chuyển dữ liệu từ quy trình này sang tiến trình khác. Nếu bộ đệm đầy, quá trình ghi phải chờ quá trình đọc để lấy một số dữ liệu từ bộ đệm.

Vì vậy, quá trình bạn đã bắt đầu có thể chờ bạn đọc từ đầu ra tiêu chuẩn, nhưng bạn đang chờ quá trình kết thúc trước khi bạn bắt đầu đọc -> bế tắc.

Giải pháp là đọc liên tục trong khi quá trình đang chạy - chỉ cần gọi StandardOutput.ReadToEnd() trước khi bạn gọi WaitForExit(). Nếu bạn muốn đọc mà không chặn luồng hiện tại, bạn có thể sử dụng các sự kiện BeginOutputReadLine()OutputDataReceived.

+0

Arh, giải thích điều đó! Cảm ơn :-) –

1

Dường như bạn phải nghe luồng StandardOutput nếu bạn chuyển hướng nó, nếu không Quy trình sẽ không thoát. Nó chờ ai đó đọc đầu ra trước.

Process.Exited event is not be called

Các vấn đề liên quan