12

Khi tôi sử dụng trình gỡ rối VSTS để xem các thuộc tính của thể hiện của lớp Process, nhiều thuộc tính được đánh dấu bằng InvalidOperationException. Tại sao? Tôi có làm gì sai không?Ngoại lệ hoạt động không hợp lệ từ C# Process Class

Tôi đang sử dụng VSTS 2008 + C# + .Net 2.0 để phát triển ứng dụng bảng điều khiển.

Đây là mã của tôi:

System.Diagnostics.Process myProcess = new System.Diagnostics.Process(); 
myProcess.StartInfo.FileName = "IExplore.exe"; 
myProcess.StartInfo.Arguments = @"www.google.com"; 
myProcess.StartInfo.Verb = "runas"; 
myProcess.Start(); 

Và một ảnh chụp màn hình của debugger:

http://i26.tinypic.com/bdldvm.jpg http://i26.tinypic.com/bdldvm.jpg

+1

Vui lòng tải lên chi tiết về thông báo ngoại lệ. –

+0

Cảm ơn, Chansik, thông báo ngoại lệ chi tiết (Exception.Message) là "Không có quá trình nào được liên kết với đối tượng này". Tôi đã thử nghiệm sau khi quá trình bắt đầu, các giá trị đang trở nên hợp lệ. Tôi nhầm lẫn lý do tại sao trước khi quá trình bắt đầu các giá trị được hiển thị như InvalidOperationException? Đó là vì mục đích gì (tại sao không có giá trị mặc định để hiển thị)? – George2

Trả lời

28

Had bạn thực sự bắt đầu quá trình này khi hình ảnh được đưa debugger? Đó là ảnh chụp màn hình tôi mong đợi để xem trước khi phương thức Start() được gọi.

Lưu ý rằng mẫu chung là tạo ProcessStartInfo, điền vào nó và sau đó gọi phương thức tĩnh Process.Start(startInfo). Điều đó làm cho nó đơn giản hơn về khái niệm: bạn không thấy đối tượng Process cho đến khi nó được bắt đầu.

+0

Cảm ơn Jon, tôi đã thử nghiệm sau khi quá trình bắt đầu, các giá trị đang trở nên hợp lệ. Tôi nhầm lẫn lý do tại sao trước khi quá trình bắt đầu các giá trị được hiển thị như InvalidOperationException? Đó là vì mục đích gì (tại sao không có giá trị mặc định để hiển thị)? – George2

+1

Bởi vì getter là ném một ngoại lệ. Điều đó có nghĩa nếu bạn nghĩ về nó; các thuộc tính đó sẽ không hợp lệ cho đến khi quá trình đã bắt đầu hoặc đã thoát. –

+4

Chúng chắc chắn sẽ không * trả về giá trị mặc định. Nếu họ đã làm, người ta có thể giả định rằng những giá trị đó đã được trả lại một cách chính xác từ một quá trình thực tế. Những gì bạn đang làm là tương đương với yêu cầu một tham chiếu null cho chiều dài của nó như là một chuỗi ... nó không có một, nó không phải là một chuỗi! Tương tự như vậy bạn không * có * một quá trình để yêu cầu số lượng xử lý của nó vv Ngoại lệ cho bạn biết bạn đang làm gì đó sai *: cụ thể là tìm nạp thuộc tính trước khi bắt đầu quá trình.Điều đó không bao giờ có thể là một điều hữu ích để làm, và ngoại lệ là một chỉ số tốt hơn nhiều so với giá trị mặc định sẽ được. –

4

Hầu hết các thuộc tính có sẵn sau khi quá trình IExplore bắt đầu.

+0

Vì vậy, bạn nghĩ rằng nó được mong đợi? – George2

+0

Hi ArsenMkrt, tôi đã thử nghiệm sau khi quá trình bắt đầu, các giá trị đang trở nên hợp lệ. Tôi nhầm lẫn lý do tại sao trước khi quá trình bắt đầu các giá trị được hiển thị như InvalidOperationException? Đó là vì mục đích gì (tại sao không có giá trị mặc định để hiển thị)? – George2

+1

Vì các thuộc tính đó không có ý nghĩa trước khi bắt đầu quá trình, nên xử lý thuộc tính xử lý của quy trình nếu quá trình này không được bắt đầu? Hoặc làm thế nào để biết là có lỗi hay không để điền vào các thuộc tính lỗi trước khi quá trình bắt đầu? –

1

Vâng, đây là hành vi mong đợi và nó cũng được ghi rõ trong MSDN.

Ví dụ: Thuộc tính Process.BasePriority có thể ném ngoại lệ InvalidOperationException khi quá trình đã thoát hoặc quá trình chưa bắt đầu (xem thêm chi tiết trong MSDN).

+0

Cảm ơn Chansik, câu trả lời của bạn tạo cảm giác! – George2

1

Nhiều thuộc tính được đánh dấu bằng InvalidOperationException vì cho đến khi bạn bắt đầu quá trình. Đối tượng 'myProcess' không liên quan đến bất kỳ tiến trình đang chạy nào và do đó nó không thể nhận được thông tin.

Hãy thử thêm các báo cáo, sau khi mã để bắt đầu quá trình

if (myProcess != null) 
{ 
    myProcess.WaitForExit(); 
    //or any other statements for that matter 
} 

Bây giờ, khi bạn đang ở trong câu lệnh if, trình gỡ lỗi VSTS sẽ có thể hiển thị hầu hết các tài sản gắn liền với đối tượng myProcess . Điều này xảy ra bởi vì, đối tượng myProcess bây giờ được kết hợp với một tiến trình đang chạy "IExplore.exe".

+0

Tuyệt vời, cảm ơn Pradeepneo! – George2

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