2010-10-02 13 views
8

Câu hỏi này đã được hỏi nhiều hơn một lần trước đây, nhưng tôi không tìm thấy câu trả lời thỏa đáng trong bất kỳ cuộc thảo luận nào.Cách vô hiệu hóa đệm đầu ra trong Process.StandardOutput

Tôi đang khởi chạy quy trình dòng lệnh tạo ra phép đo thời gian thực cho STDOUT, tạo ra kết quả mới khoảng mỗi giây. Sử dụng kết quả System.Diagnostics.Process.StandardOutput trong độ trễ hoàn toàn không được chấp nhận (trên 20 giây) khi dữ liệu STDOUT hoạt động thông qua bộ đệm 4k trong Process.StandardOutput StreamReader và dường như không có cách nào để giải quyết vấn đề này.

Quy trình gọi.StandardOutput.BaseStream.Flush() không hoạt động.

Tôi đã thử thực hiện đọc đồng bộ từng byte của Process.StandardOutput, nhưng tôi vẫn còn 4k phía sau đầu ra thực tế.

Có ai ít nhất có thể xác minh cho tôi rằng có thể bằng cách nào đó khắc phục tất cả các vấn đề đệm mà tôi đang gặp phải với chuyển hướng STDOUT và nhận dữ liệu trong ứng dụng ngay khi nó xuất hiện trong cửa sổ trình bao không? Tôi có thể kế thừa từ lớp Process và thay đổi cách streamreader của StandardOutput hoạt động không? Tôi có cần phải xem các cuộc gọi WINAPI thô không? Bằng cách nào đó, điều này đã được thực hiện, ngay cả khi tôi kết thúc bằng văn bản không được quản lý C++ để khởi động nhiệm vụ và tiêu thụ đầu ra, và liên kết mà in Bất kỳ trợ giúp được đánh giá cao ;.. Tôi đang ở cuối wit của tôi ...

Chỉnh sửa: Có vẻ như những gì tôi cần là .Net triển khai các thư viện "mong đợi" có sẵn cho C/C++, Perl, Python và Java (đó là những người duy nhất tôi đã tìm thấy cho đến nay). Có ai biết nếu một con thú như vậy tồn tại?

+0

hút bạn không bao giờ có câu trả lời hay cho câu hỏi này ... –

+0

Vâng. Cuối cùng tôi đã có được mã nguồn cho lệnh bên ngoài và biên dịch lại nó bằng cách xóa bộ đệm STDOUT rõ ràng. Tuy nhiên, tôi vẫn muốn giải quyết vấn đề ban đầu. Tôi đã đùa giỡn với việc viết một triển vọng .Net Mong đợi bản thân mình, nhưng biên dịch lại công cụ bên ngoài có vẻ như một cách tốt hơn để tránh việc ông chủ của tôi hét lên với tôi. –

+0

Tôi đã đấu tranh với cùng một vấn đề. Tôi đang đọc đầu ra giao diện điều khiển trong một chủ đề riêng biệt (hoặc thực sự 2: 1 cho stderr, 1 cho stdout). Khi nó quay ra, bộ đệm chỉ StandardOutput khi bạn đang sử dụng các cuộc gọi như 'Peek', sẽ trả về -1 trong tiến trình. Nếu bạn chỉ đơn giản sử dụng 'ReadLine' hoặc' Read' với 1 byte, nó sẽ hoạt động tốt, và bạn sẽ không gặp rắc rối với bộ đệm. – atlaste

Trả lời

1

"[I] có cách nào để khởi chạy nó như vậy [nó] nó không nhận ra nó đang được chuyển hướng không?" CÓ: đó chính xác là miền Mong đợi. Tôi biết không thực hiện .Net; nó chắc chắn khả thi, mặc dù ...

+0

Rất khó khăn do cách Windows hoạt động nội bộ! (Vâng, không phải với Mono trên Unix, nơi bạn đã có quyền truy cập vào các thiết bị đầu cuối ảo thực sự, nhưng đó là một câu chuyện khác.) Mong đợi cho Windows sử dụng một số loại chế độ gỡ lỗi funky để làm cho nó tất cả các công việc, và AIUI là một hack thực sự tổng. Nó có lẽ sẽ dễ dàng hơn khi sử dụng chính bản thân 'mong đợi' (chạy kịch bản' unbuffer') trong một tiến trình con; có, nó làm cho việc triển khai trở nên khó khăn hơn, nhưng nó * có * có cơ hội hoạt động tốt. Ngoại trừ với 'telnet.exe'; đó là một trường hợp đặc biệt (và thêm sucky). –