2010-07-19 20 views

Trả lời

30

Sau khi tiếp tục điều tra vấn đề này, tôi muốn tóm tắt sự khác biệt:

Chấm dứt:

  • sự kiện hoàn thành của ứng dụng workflow sẽ được kích hoạt
  • các CompletionState (WorkflowApplicationCompletedEventArgs) được faulted
  • sự kiện chưa tải của ứng dụng quy trình làm việc sẽ được kích hoạt
  • luồng công việc hoàn tất
  • OnBodyCompleted vào hoạt động sẽ được gọi

Cancel:

  • sự kiện hoàn thành của ứng dụng workflow sẽ được kích hoạt
  • các CompletionState (WorkflowApplicationCompletedEventArgs) được hủy
  • sự kiện bốc dỡ ứng dụng quy trình làm việc sẽ được kích hoạt
  • quy trình làm việc hoàn thành
  • OnBodyCompleted vào hoạt động sẽ được gọi

Abort:

  • trường hợp hủy bỏ việc áp dụng quy trình làm việc sẽ được kích hoạt
  • các công việc không hoàn thành

Một ngoại lệ unhandled

  • gây OnUnhandledException
  • trong eventhandler này giá trị trả về (kiểu UnhandledExceptionAction) xác định những gì sẽ xảy ra tiếp theo:
  • UnhandledExceptionAction.Terminate sẽ chấm dứt dụ workflow
  • UnhandledExceptionAction.Cancel sẽ hủy dụ workflow
  • UnhandledExceptionAction .Abort sẽ hủy bỏ thể hiện dòng công việc
  • Từng sẽ kích hoạt các sự kiện tương ứng được giải thích ở trên

Cập nhật: Hủy bỏ dường như không kích hoạt việc dỡ bỏ cá thể trong kho lưu trữ SQL persistence. Vì vậy, có vẻ như với tôi, bạn nên sử dụng Cancel hoặc Terminate và nếu bạn phải thực hiện một số hành động dựa trên trạng thái hoàn thành, bạn có thể kiểm tra CompletionState trong sự kiện Complete.

15

Đầu tiên, mũ ra để Steffen Opel (và ý kiến ​​của ông dưới đây). Tôi không thể bắt được bài đăng gốc của mình linkeddocumentationWF 3.5 cụ thể. Đã đào sâu hơn một chút.

Vì lợi ích của hậu thế, tôi đã để lại phản hồi trước đó của tôi bên dưới, được gắn nhãn là WF3.5. Vui lòng xem WF4.0 để biết một số lưu ý về Hủy, Hủy và Chấm dứt trong WF4.0.


WF4.0

Thật không may, có rất ít sự khác biệt tài liệu thảo luận rõ ràng trong Huỷ, Abort, và Chấm dứt trong WF4.0. Tuy nhiên, từ membermethoddocumentation,

  1. On Abort, a) hoạt động được ngay lập tức dừng lại, b) handler Đã hủy bỏ được gọi, và c) handler Completed là không gọi.
  2. Khi hủy, a) hoạt động được cấp thời gian gia hạn để dừng một cách duyên dáng sau khi một TimeoutException được ném, b) Trình xử lý đã hoàn thành được gọi.
  3. Khi Chấm dứt, a) hoạt động được đưa ra một thời gian gia hạn để dừng một cách duyên dáng sau khi một TimeoutException được ném, b) Trình xử lý đã hoàn thành được gọi.

Sự khác biệt giữa Hủy bỏ và Hủy/Chấm dứt là khá nổi bật. Đơn giản chỉ cần gọi Abort để giết một Workflow hoàn toàn. Sự khác biệt giữa Hủy và Chấm dứt là sắc thái hơn. Hủy không yêu cầu bất kỳ loại lý do nào (nó là một phương pháp không tham số void), trong khi đó, khi kết thúc yêu cầu một lý do (ở dạng chuỗi hoặc ngoại lệ).

Trong mọi trường hợp, thời gian chạy Quy trình làm việc sẽ không thực hiện bất kỳ hành động ngầm nào thay mặt bạn (ví dụ: Quy trình làm việc sẽ không tự động hủy kết thúc la WF3.5). Tuy nhiên, với việc xử lý sự kiện ngoại lệ có thể tùy biến cao được hiển thị bởi thời gian chạy, bất kỳ tính năng nào như vậy cũng có thể được triển khai dễ dàng.


WF3.5

hủy

Theo Msdndocumentation

Một hoạt động được đặt vào tình trạng hủy bởi một hoạt động cha mẹ một cách rõ ràng, hoặc vì một ngoại lệ đã được ném trong khi thực hiện hoạt động đó.

Trong khi hủy có thể được sử dụng để ngăn chặn toàn bộ luồng công việc (tức là được kích hoạt trên hoạt động gốc), nó thường được sử dụng để ngăn chặn các phần riêng biệt của luồng công việc (tức là phục hồi lỗi hoặc hành động rõ ràng trên một phần của phụ huynh)). Tóm lại, Hủy bỏ là một phương tiện của luồng điều khiển luồng công việc.

Abort và Chấm dứt

Một lần nữa, theo Msdn documentation

Abort khác với Chấm dứt ở chỗ trong khi Abort chỉ đơn giản là xóa trong bộ nhớ workflow dụ và có thể được khởi động lại từ điểm kiên trì cuối cùng , Chấm dứt xóa ví dụ dòng công việc trong bộ nhớ và thông báo cho dịch vụ kiên trì rằng cá thể đã được xóa khỏi bộ nhớ. Đối với SqlWorkflowPersistenceService, điều này có nghĩa là tất cả thông tin trạng thái cho cá thể dòng công việc đó sẽ bị xóa khỏi cơ sở dữ liệu khi chấm dứt. Bạn sẽ không thể tải lại thể hiện dòng công việc từ một điểm lưu trữ được lưu trước đó.

Điều này khá rõ ràng. Hủy bỏ chỉ dừng lại trong thực hiện bộ nhớ trong khi Chấm dứt dừng thực hiện trong bộ nhớ phá hủy bất kỳ trạng thái tồn tại nào.

+2

Hmmh, các liên kết MSDN của bạn đều nhắm mục tiêu tài liệu WF 3.5. Mặc dù có rất nhiều điểm tương đồng về khái niệm, kiến ​​trúc [đã thay đổi đủ] (http://msdn.microsoft.com/en-us/library/dd489410.aspx) để làm cho câu trả lời của WF 3,5 thành câu hỏi WF 4 khó hiểu nhất , Tôi sợ - xem phần ví dụ * Vòng đời hoạt động * ở cuối [Kiến trúc dòng công việc Windows] (http://msdn.microsoft.com/en-us/library/dd489413.aspx) so với [Hiểu mô hình trạng thái hoạt động] (http://msdn.microsoft.com/en-us/library/bb628512%28VS.90%29.aspx) như được liên kết từ bạn trả lời. –

+0

cảm ơn, bắt tốt! hy vọng phản hồi được cập nhật của tôi rõ ràng hơn và chính xác hơn một chút :) –

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