2011-11-22 28 views
24

Tôi đang tìm kiếm ý tưởng về cách làm cho RX dễ dàng gỡ lỗi hơn. Nó có thể rất khó khăn để tìm ra điểm thất bại khi một nguồn được truyền qua các combiners và throttles và publish và như vậy.Thủ thuật gỡ lỗi bằng Tiện ích mở rộng phản ứng?

Cho đến nay tôi đã thực hiện những việc tương tự với chuỗi phức tạp - chèn Do() để truy tìm, thêm trường "tên" vào một phần kiểu ẩn danh, lấy các dấu vết ngăn xếp đôi khi .. Nhưng chúng tôi có lẽ hàng trăm nhà sản xuất và có thể hàng ngàn người tiêu dùng trong hệ thống của chúng tôi và nó rất khó để cô lập các vấn đề.

Bạn có loại thủ thuật nào để gỡ lỗi việc sử dụng RX của mình?

+2

Câu hỏi hay. Tôi luôn đấu tranh để gỡ lỗi mã Rx của mình. – Tim

+7

Tôi mạnh mẽ không đồng ý với câu hỏi này bị casperOne đóng một cách tình cờ. Tôi đang tìm kiếm chuyên môn trong một công nghệ rất cụ thể. Câu hỏi này sẽ * không * có khả năng dẫn đến "ý kiến, tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng". – scobi

+1

Không xây dựng? Có lẽ câu hỏi không đủ cụ thể, nhưng đó là một câu hỏi rất có giá trị. Ồ, quay lại câu hỏi "tại sao không biên dịch mã này". –

Trả lời

7

tôi nghĩ rằng một constructive discussion về chủ đề này đã được có trên diễn đàn Rx năm 2009.

Thay vì thêm Adhoc Do khai thác vào truy vấn của bạn, bạn sẽ thêm một nhà điều hành tùy chỉnh Log/Trace. Toán tử này sẽ nắm bắt các sự kiện Đăng ký, Hủy bỏ, OnNext, OnError và OnCompleted. Tùy thuộc vào việc thực hiện của bạn, nó chỉ có thể ghi vào bàn điều khiển, sử dụng thư viện Logger yêu thích của bạn hoặc thậm chí tạo các sự kiện ETW cho OS và tích hợp Visual Studio.

public static class ObservableTrace 
{ 
    public static IObservable<TSource> Trace<TSource>(this IObservable<TSource> source, string name) 
    { 
     int id = 0; 
     return Observable.Create<TSource>(observer => 
     { 
      int id1 = ++id; 
      Action<string, object> trace = (m, v) => Debug.WriteLine("{0}{1}: {2}({3})", name, id1, m, v); 
      trace("Subscribe", ""); 
      IDisposable disposable = source.Subscribe(
       v => { trace("OnNext", v); observer.OnNext(v); }, 
       e => { trace("OnError", ""); observer.OnError(e); }, 
       () => { trace("OnCompleted", ""); observer.OnCompleted(); }); 
      return() => { trace("Dispose", ""); disposable.Dispose(); }; 
     }); 
    } 
} 
+0

Hãy thử + Seq http://www.lavinski.me/debugging-rx-with-seq/ này –

11

Một mẹo quan trọng cho việc đánh bắt lỗi Rx là để thử lại gỡ lỗi với ngoại lệ đầu tiên có cơ hội kích hoạt, điều này làm cho nó như vậy nhiều khả năng bạn sẽ nhận được một thông điệp ngoại lệ thực sự thay vì một rethrown một:

+0

Tôi luôn ngạc nhiên khi mọi người không chạy với ngoại lệ được thiết lập để bắt cơ hội đầu tiên. Nó giống như bay mù. – scobi

+0

Rx thường phụ thuộc vào thời gian để bước qua thường không phải là một lựa chọn. Dấu vết được sử dụng trong gỡ lỗi thời gian nhạy cảm. –

+0

Làm rõ, màn hình này có sẵn trong Gỡ lỗi> Ngoại lệ (không có trong Tùy chọn). https://msdn.microsoft.com/en-us/library/d14azbfh.aspx –

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