2009-06-26 4 views
7

Bên trong luồng công việc tôi muốn xử lý và lỗi như không thể tra cứu tên người dùng mà tôi muốn gán nhiệm vụ. Vì vậy, tên người dùng không tồn tại, tôi sẽ thông báo cho quản trị viên bằng email về điều này, đăng nhập vào lịch sử quy trình làm việc và sau đó chấm dứt luồng công việc.Lập trình Hủy quy trình làm việc SharePoint

Câu hỏi là, làm cách nào để chấm dứt luồng công việc, từ bên trong luồng công việc như thể tôi đã nhấp vào nút 'chấm dứt luồng công việc' trên trang web SharePoint.

[Cập nhật] Tôi đã thử SPWorkflowManager.CancelWorkflow() thực sự hủy luồng công việc nhưng không thực hiện ngay lập tức. Điều gì xảy ra là mã để hủy chạy nhưng sau đó luồng công việc của tôi tiếp tục để tạo tác vụ tiếp theo và sau đó chuyển sang chế độ ngủ khi nó nhấn vào các tác vụ tiếp theo của hoạt động onTaskChanged. Chỉ một khi nó đã đi vào giấc ngủ thì dòng công việc sẽ bị chấm dứt, không phải khi CancelWorkflow được gọi.

Điều này gây ra sự cố rõ ràng mà tôi không muốn tạo tác vụ tiếp theo. Tôi đang gọi CancelWorkflow vì tôi muốn nó hủy bỏ sau đó và ở đó.

+0

Bạn đã bao giờ tìm thấy câu trả lời cho câu hỏi này chưa? –

+0

Vô số không. Bạn có thể gắn cờ để hủy luồng công việc giữa nhưng không dừng lại ở đó và ở đó. –

Trả lời

9

Có khá một vài gợi ý tại MSDN chủ đề này:

Terminating a SharePoint Workflow Programatically

Dưới đây là một blog-bài mà succintly chứa các thông tin tương tự chính xác: Cancelling a SharePoint Workflow

Cuối cùng, và đặc biệt nhất , bạn cần sử dụng phương pháp tĩnh: SPWorkflowManager.CancelWorkflow(SPWorkflow workflowInstanceToBeCancelled)

EDIT

CancelWorkflow là một lớp tĩnh, vì vậy tôi đã sửa đổi cuộc gọi.

+0

Tôi đã thử điều này nhưng nó chưa giải quyết được vấn đề của tôi. Tôi đã cập nhật bài đăng chính để phản ánh điều này. –

+0

Nếu bất kỳ ai khác cố gắng SPWorkflowManager.CancelWorkflow() bạn có thể bỏ lỡ nó lần đầu tiên. Phương thức này là tĩnh vì vậy bạn muốn gọi nó trên chính lớp đó chứ không phải đối tượng trình quản lý luồng công việc có thể nhận được từ SPSite như tôi đã thử. –

+2

Nhưng nó hoạt động chính xác khi bạn gọi nó chính xác, phải không? Đó là, khi bạn gọi nó trên chính lớp SPWorkflowManager.CancelWorkflow (SPWorkflow workflowInstance); sau đó nó làm những gì nó được cho là phải làm. – DevinB

0

Tôi không chắc đây có phải là cách tốt nhất hay không, nhưng tôi chỉ gặp lỗi, đăng nhập và sau đó ném lại. Điều này dẫn đến trạng thái "Đã xảy ra lỗi" trong danh sách và ngay lập tức dừng luồng công việc.

protected override ActivityExecutionStatus Execute(ActivityExecutionContext provider) 
{ 
    try 
    { 
     // do work 
     // ... 
    } 
    catch (Exception e) 
    { 
     // log the error to the history list 
     // ... 
     throw; 
    } 

    return ActivityExecutionStatus.Closed; 
} 
0

Đây là câu hỏi khá cũ, nhưng phải hủy bỏ công việc từ bản thân ngay lập tức là dễ dàng sử dụng đoạn mã này:

SPWorkflowManager.CancelWorkflow(workflowProperties.Workflow); 
throw new Exception(); 

workflowProperties trong ví dụ này là phương pháp

public SPWorkflowActivationProperties workflowProperties = 
      new SPWorkflowActivationProperties(); 

CancelWorkflow sẽ gắn cờ luồng công việc là "hủy", nhưng sẽ không dừng nó cho đến khi tạm dừng (như chờ đợi sự kiện ontaskchanged) hoặc ngoại lệ trong quy trình làm việc. Vì vậy, tuyên bố tiếp theo của ném ngoại lệ mới() sẽ dừng quy trình làm việc và đặt trạng thái của nó là "Đã hủy".