2016-09-21 117 views
2

類別TaskHolder有一個屬性類型Task。我將Task作爲參數傳遞給構造函數,並立即啓動。有沒有辦法阻止它開始?阻止啓動任務

public class Worker 
{ 
    public class TaskHolder 
    { 
     public TaskHolder(Task objective) 
     { 
      Objective = objective; 
     } 

     public Task Objective { get; set; } 
    } 

    public async Task DoSomething() 
    { 
     await Task.Delay(5000); 
     Debugger.Break(); // Task starts, so debugger stops here! 
     // Is there a way to prevent it from start? 
    } 

    [Test] 
    public async Task TempTest() 
    { 
     // programm starts here: 
     var t1 = new TaskHolder(DoSomething()); 
     await Task.Delay(10000); 
    } 
} 
+0

我可以問你爲什麼不要它開始?這是爲了調試嗎? – GrandMasterFlush

+0

'實際代碼中的'TaskHolder'有'List Steps {get;設置;}',它擁有多個步驟來逐個執行,而不是同時執行。我想定期執行這個步驟。現在我看到我的實現是錯誤的。 B.t.w.第一次運行後,步驟變成了「RanToCompletion」狀態,因此再次啓動它們的唯一方法是重新創建它們。 – AsValeO

+1

「'列表步驟{get; set;}'擁有多個步驟來逐個執行,而不是同時執行」 - 這根本不是「Task」所代表的。這聽起來應該是'List ' –

回答

4

A Task表示等待操作的現在或未來結果。如果該任務已經開始,那很有趣 - 但它與代碼收到任務無關。

如果您還不想開始某些事情,那麼您應該通過Action。您可以通過Task.RunAction創建Task。或者你可以簡單地通過action()或action.Invoke()調用動作。

如果你想運行的是明確異步的:你可以通過Func<Task>。再次,如果您想要代表最終狀態的Task,您可以使用Task.Run開始此類代表。或者你可以調用它。

(是否Invoke()它或把它傳給Task.Run()取決於你是否希望它使用線程任之)

最後,當你叫DoSomething()開始運行的代碼。計時器由Task.Delay安排,然後代碼繼續到TaskHolder

+0

所以用簡單的話來說。如果我創建一個Task實例,它可以立即啓動,我無法控制它。爲什麼'新的Task()'是這個規則的例外呢? – AsValeO

+1

@AsValeO不,這不是什麼意思;它比這更微妙。在這種情況下,你得到的'Task'是**你開始**的'async'方法的結果。還有其他類型的「任務」。例如,如果您使用'TaskCompletionSource ',那麼可以將'.Task'提交給人員,並且根本不會執行任何操作。但它也不代表將來可運行的操作!你需要單獨的代碼(可能是一個IO回調)來觸發完成狀態('TrySetResult'等)。再說一遍:正確的使用取決於你想要做什麼 - 在你的例子中不清楚的東西。 –

+0

你已經幫了我很多了! – AsValeO