调用Task.Start()时更新参数值

本文关键字:更新 参数 Task Start 调用 | 更新日期: 2023-09-27 18:25:20

调用Task.Start()时,如何更新发送给WriteToConsole的参数currentTime

在下面的示例中,当我声明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
        }
    }
}

调用Task.Start()时更新参数值

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

应该起作用,因为捕获的是变量,而不是值。

将参数封装在包装类中,如下所示:

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=>…),那么使用th的答案,这是一个更好的因子分解。