2009-07-29 37 views
7

Có một chuỗi nhiệm vụ phức tạp, thực hiện xử lý lỗi có thể nhanh chóng làm nổi bật mã khi sử dụng các khối try/catch và các công cụ như bộ thu Choice trên PortSet<ActualResult, Exception> cho mọi tác vụ nhỏ.CCR: Thực hành tốt nhất để xử lý lỗi bằng cách sử dụng các nguyên nhân

Rất may CCR dường như cung cấp một cơ chế để xử lý các ngoại lệ theo cách tổng quát hơn cho biểu đồ các tác vụ: nguyên nhân. Một ví dụ điển hình trông như thế này:

Port<Exception> exceptionPort = new Port<Exception>(); 
Dispatcher.AddCausality(new Causality("some job", exceptionPort)); 
Arbiter.Activate(
    dispatcherQueue, 
    Arbiter.Receive(false, exceptionPort, ex => Console.WriteLine(ex))); 
// now schedule the real tasks 

Trong trường hợp của tôi, tôi có một ứng dụng chuyên sâu máy tính bằng cách sử dụng CCR để thực hiện một phân tán/tập kịch bản, tách "việc làm" vào một loạt các nhiệm vụ song song. (Bên cạnh đó, nhiều hơn một trong những công việc này có thể chạy cùng một lúc.) Trong trường hợp một nhiệm vụ không thành công, tôi muốn ngừng tất cả các công việc còn lại trong công việc, nhưng không phải bất kỳ công việc nào khác. (Kết quả là không sử dụng cho tôi nếu tôi đang thiếu một mảnh của câu đố, vì vậy tiếp tục làm việc trên này sẽ chỉ là một sự lãng phí thời gian CPU.)

Câu hỏi là cách tốt nhất sẽ là gì thực hiện việc dừng.

Một ý tưởng sẽ là:

  1. Tạo một đơn Dispatcher dụ và giữ nó trên ứng dụng suốt đời.
  2. Tạo mới DispatcherQueue cho mọi "công việc" (một nhóm nhiệm vụ). Thêm Causality ngay sau khi tạo DispatcherQueue.
  3. Trong trình xử lý cho hàng đợi ngoại lệ, hãy gọi Suspend() trên số DispatcherQueue.
  4. Trước khi xử lý hàng đợi điều phối, hãy xóa quan hệ nhân quả.

Tôi tự hỏi liệu gợi ý này có thể được coi là thực hành tốt nhất hay không, hoặc nếu có cách tiếp cận tốt hơn để giải quyết tình huống - có lẽ khá phổ biến.

Trả lời

1

Có vẻ như một cách hay để tìm hiểu về tôi.

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