C# 稍后执行函数

C# 稍后执行函数,c#,scheduled-tasks,C#,Scheduled Tasks,我有以下代码,其目的是在特定时间调用函数。但是,我在WaitTask.Start()时遇到异常被调用附加信息:承诺式任务不能调用Start。 DateTime today = DateTime.Today; DateTime twoThirtyET = today.AddHours(14.50); Execute(CallAtTime, twoThirtyET); public void Execute(Action action, DateTime ExecutionTime) {

我有以下代码,其目的是在特定时间调用函数。但是,我在
WaitTask.Start()时遇到异常被调用
附加信息:承诺式任务不能调用Start。

DateTime today = DateTime.Today;
DateTime twoThirtyET = today.AddHours(14.50);

Execute(CallAtTime, twoThirtyET);

public void Execute(Action action, DateTime ExecutionTime)
{
    Task WaitTask =          Task.Delay((int)ExecutionTime.Subtract(DateTime.Now).TotalMilliseconds);
    WaitTask.ContinueWith(_ => action);
    WaitTask.Start();
}

private void CallAtTime()
{
    Console.WriteLine("Called at time");
}
你可以用定时器。(2000是以毫秒为单位的间隔,因此为2秒)

你可以用定时器。(2000是以毫秒为单位的间隔,因此为2秒)


您正在获得
附加信息:可能不会对承诺式任务调用Start。
因为来自
任务的
任务
。延迟
已经启动,请查看以获取更多信息

最简单的更改是删除对
WaitTask.StartNew()
的调用,因为这是不必要的

哦,您可能希望在回调中实际调用您的操作,而不仅仅是返回它:

WaitTask.ContinueWith(_ => action());

您正在获得
附加信息:可能不会对承诺式任务调用Start。
因为来自
任务的
任务
。延迟
已经启动,请查看以获取更多信息

最简单的更改是删除对
WaitTask.StartNew()
的调用,因为这是不必要的

哦,您可能希望在回调中实际调用您的操作,而不仅仅是返回它:

WaitTask.ContinueWith(_ => action());

完整示例

namespace YourNamespace
{
    using System.Threading;

    public class MainClass
    {
        public void Main()
        {
            PostponedAction action = new PostponedAction();
            action.WaitExecute(DateTime.Today.AddHours(14.5) - DateTime.Now);
        }
    }

    public class PostponedAction
    {
        public void WaitExecute(TimeSpan waitTime)
        {
            Thread.Sleep(waitTime);
            // Do stuff
        }
    }
}

完整示例

namespace YourNamespace
{
    using System.Threading;

    public class MainClass
    {
        public void Main()
        {
            PostponedAction action = new PostponedAction();
            action.WaitExecute(DateTime.Today.AddHours(14.5) - DateTime.Now);
        }
    }

    public class PostponedAction
    {
        public void WaitExecute(TimeSpan waitTime)
        {
            Thread.Sleep(waitTime);
            // Do stuff
        }
    }
}

你为什么不创建一个控制台应用程序,现在就做你想做的事情,并通过Windows Scheduler或其他一些调度工具进行调度呢?通过搜索错误消息找到的第一个答案似乎提供了你试图用这两种样式编写的几乎完全相同的代码(比你知道如何编写的计算时间要短)(
async
ContinueWith
)-所以看起来完全重复。请注意,正如@DStanley指出的,有更好更可靠的方法来实现任务调度,除非这正是您想要了解的。公平地说,可能存在Windows调度程序不合适的情况。缓存失效是我目前能想到的唯一可怕的例子。@TroelsLar当然可以。在大多数情况下,现有的解决方案处理这些问题的能力比在某些时候运行的自定义代码要好。例如,对于您的示例,大多数缓存框架都有过期超时……为什么您不创建一个控制台应用程序来完成您现在想要的任务,并通过Windows调度器或其他一些调度工具对其进行调度呢通过搜索错误消息找到的nswer似乎提供了您尝试编写的两种样式(
async
ContinueWith
)的几乎完全相同的代码(您知道如何做的计算时间很短)-所以看起来完全重复。请注意,正如@DStanley指出的,有更好更可靠的方法来实现任务调度,除非这正是您想要了解的。公平地说,可能存在Windows调度程序不合适的情况。缓存失效是我目前能想到的唯一可怕的例子。@TroelsLar当然可以。在大多数情况下,现有的解决方案处理这些问题的能力要比在某些时候运行的自定义代码要好。例如,对于您的示例,大多数缓存框架都有过期超时。。。