2014-10-01 45 views
0

Task.Start()被調用時,如何更新參數currentTime發送到WriteToConsole調用Task.Start()時更新參數值?

在下面的示例中,當我聲明task0時,currentTime的值設置爲1/1/2000。當執行task0.Start();時,currentTime的值已更改爲DateTime.Now。但Console.WriteLine顯示'1/1/2000'。

我需要做些什麼來更新currentTime,以便使用當前值調用task0.Start()?

static void WriteToConsole(DateTime n) 
{ 
    Console.WriteLine(n.ToString()); 
} 
static void Main(string[] args) 
{ 
    DateTime currentTime = new DateTime(2000, 01, 01); 
    Task task0 = new Task(n => WriteToConsole((DateTime)n), currentTime); 

    for (; ;) 
    { 
     currentTime = DateTime.Now; 
     if (true) 
     { 
      task0.Start(); 
     } 
     if (task0.Status.Equals(TaskStatus.Running)) 
     { 
      // Do Something 
     } 
    } 
} 
+0

需要更多的上下文。你是否想創建task0的多個實例,每個實例都有自己的currentTime?在這種情況下,每次啓動時都會創建一個新的Task實例。 – 2014-10-01 21:59:38

回答

1
Task task0 = new Task(() => WriteToConsole(currentTime)); 

應該工作,因爲變量被捕獲,而不是值。

+0

確實「捕獲到變量,而不是值」,但DateTime是不可變的,捕獲的變量將始終指向同一個不可變對象。調用'currentTime = [一些新的DateTime]'不會改變原始的不可變對象,而只是重新指定'currentTime'指向什麼(但是Task的捕獲變量仍然指向舊的不可變對象)。 – xpa1492 2014-10-02 04:03:40

+0

不,它不會,這個工程。 – ths 2014-10-02 06:38:31

+0

我站在更正(和驚訝:)! – xpa1492 2014-10-02 06:47:12

0

封裝參數的包裝類,像這樣:

private class DtWrapper 
{ 
    public DateTime CurrentTime {get; set; } 
} 

DtWrapper currentTime = new DtWrapper { CurrentTime = new DateTime(2000, 01, 01) } ; 
Task task0 = new Task(n => WriteToConsole(((DtWrapper)n).CurrentTime), currentTime); 

for (; ;) 
{ 
    currentTime.CurrentTime = DateTime.Now; 
    if (true) 
    { 
     task0.Start(); 
    } 
    if (task0.Status.Equals(TaskStatus.Running)) 
    { 
     // Do Something 
    } 
} 

,如果你有傳遞當前時間作爲自變量(N => ...)沒有特別的原因,然後使用這個答案,這是更好的因子。