2013-10-05 15 views
21

Có một quy trình được thực thi trong một tác vụ. Tôi không muốn nhiều hơn một trong số này để thực hiện đồng thời.Kiểm tra xem tác vụ đã chạy chưa trước khi bắt đầu mới

Đây có phải là cách chính xác để kiểm tra xem tác vụ đã chạy chưa?

private Task task; 

public void StartTask() 
{ 
    if (task != null && (task.Status == TaskStatus.Running || task.Status == TaskStatus.WaitingToRun || task.Status == TaskStatus.WaitingForActivation)) 
    { 
     Logger.Log("Task has attempted to start while already running"); 
    } 
    else 
    { 
     Logger.Log("Task has began"); 

     task = Task.Factory.StartNew(() => 
     { 
      // Stuff     
     }); 
    } 
} 
+10

Hãy xem xét sử dụng 'Task.IsCompleted' - nhưng hãy nhớ rằng có sẽ luôn là một điều kiện chủng tộc ở đây. Nếu tác vụ hoàn thành * chỉ * sau khi bạn kiểm tra, bạn sẽ không chạy nó một lần nữa - có được không? Hay bạn * thực sự * muốn bắt đầu một nhiệm vụ thứ hai ngay sau khi nhiệm vụ đầu tiên kết thúc? –

+0

Ah, tôi không thấy 'Task.IsComplete'. Có, điều kiện chủng tộc không phải là một vấn đề. Cảm ơn và cảm thấy tự do để tạo ra một câu trả lời. – davenewza

+0

@davenewza, bạn có thể muốn xem [Mẫu để tự hủy và khởi động lại tác vụ] (http://stackoverflow.com/questions/18999827/a-pattern-for-self-cancelling-and-restarting-task) – Noseratio

Trả lời

26

Theo đề nghị của Jon Skeet, các Task.IsCompleted là lựa chọn tốt hơn.

Theo MSDN:

IsCompleted sẽ trở thành sự thật khi nhiệm vụ là một trong ba trạng thái cuối: RanToCompletion, Faulted, hoặc Canceled.

Nhưng dường như nó cũng trả về đúng ở trạng thái TaskStatus.WaitingForActivation.

4
private Task task; 

public void StartTask() 
{ 
    if ((task != null) && (task.IsCompleted == false || 
          task.Status == TaskStatus.Running || 
          task.Status == TaskStatus.WaitingToRun || 
          task.Status == TaskStatus.WaitingForActivation)) 
    { 
     Logger.Log("Task is already running"); 
    } 
    else 
    { 
     task = Task.Factory.StartNew(() => 
     { 
      Logger.Log("Task has been started"); 
      // Do other things here    
     }); 
    } 
} 
2

Bạn có thể kiểm tra xem nó với:

if ((taskX == null) || (taskX.IsCompleted)) 
{ 
    // start Task 
    taskX.Start(); 
    //or 
    taskX = task.Factory.StartNew(() => 
    { 
     //?? 
    } 
} 
Các vấn đề liên quan