Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建长时间延迟的任务是否可以接受?_C#_Async Await_Task Parallel Library - Fatal编程技术网

C# 创建长时间延迟的任务是否可以接受?

C# 创建长时间延迟的任务是否可以接受?,c#,async-await,task-parallel-library,C#,Async Await,Task Parallel Library,我正在创建一个调度程序,在一天中的特定时间触发事件,为此,我正在使用一个任务旋转任务(一次一个,即仅“下一个”计划)。任何任务的延迟都会延迟几天。例如,在上一个事件在周五下午发生后,我将设置下一个事件,该事件将在周一的某个时间发生,因此可能会有长达3天(约260000000毫秒)的时间跨度 这种做法是否可以接受?我担心这对于生产环境来说不够稳定/健壮 下面是一些代码片段,用于描述我所编写的内容: private void SetNextEvent() { TimeModel next =

我正在创建一个调度程序,在一天中的特定时间触发事件,为此,我正在使用一个任务旋转任务(一次一个,即仅“下一个”计划)。任何任务的延迟都会延迟几天。例如,在上一个事件在周五下午发生后,我将设置下一个事件,该事件将在周一的某个时间发生,因此可能会有长达3天(约260000000毫秒)的时间跨度

这种做法是否可以接受?我担心这对于生产环境来说不够稳定/健壮

下面是一些代码片段,用于描述我所编写的内容:

private void SetNextEvent()
{
    TimeModel next = GetNextScheduledTime();
    Debug.WriteLine($"Next schedule [{next.TimeType}]: {next.Time.ToString("yyyy-MM-dd HH:mm:ss")}");

    TimeSpan delay = next.Time.Subtract(DateTime.Now);
    Task.Run(async () =>
    {
        await Task.Delay(delay);
        FireEvent(next);
    });
}

private void FireEvent(TimeModel time)
{
    Debug.WriteLine($"Event fired [{time.TimeType}]: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
    OnSchedulerEvent?.Invoke(this, new SchedulerEventArgs { ScheduleType = time.TimeType });
    if (_running)
        SetNextEvent();
}

如果您正在运行Windows,我会使用TaskScheduler来执行您尝试执行的操作

运行
taskschd.msc
您可以使用该程序安排定期任务


右边的面板上应该有一个“创建任务…”按钮

我同意Windows任务调度程序可能是最好的方法,因为您可以提前知道运行下一个任务的时间表

如果您事先不知道这一点(即等待下一个任务的时间可能会有所不同),那么我建议在计时器过期时使用计时器和事件处理程序方法


每次都可以为等待时间设置计时器的Interval属性。当时间到期时,计时器事件处理程序将运行,它可以执行ask并重置计时器的间隔。这似乎比任务更干净。延迟。

这是完全可靠的。网络计时器非常有效。最大的问题是,你必须假设你的生产应用程序可以随时退出。最容易理解的原因是一个杀死进程的bug。其他原因包括重新启动、应用程序池回收、部署等

所以如果你在被杀后能恢复你的状态就好了。如果您对具体问题发表评论,我将予以解决

看起来你有办法恢复计时器,因为你显然可以计算下一个到期时间。在这种情况下,这样做是非常安全的。您需要确保代码始终在运行,例如在重新启动或崩溃之后


请注意,IIS应用程序需要允许同时运行多次。否则,IIS对于您的场景来说是一个很好的主机。

它能工作吗?我想是吧。首先要考虑的是,如果服务器需要重新启动,那么您将在不保持状态的情况下使用软管。有很多调度器是专门为此设计的。我认为它们将是一个更强有力的选择。如果服务器重新启动,服务将重新启动,它将调用StnExtEvEnter,它将返回相同的下一个预定时间,并从这个时间点旋转一个任务。我确实考虑了石英,但对于这两种方法我能达到的效果似乎有点过头了。您可能想检查否定<代码> TimeStPield< <代码> >假设您的代码> GETNEXPROTEDIMECTION< /COD>的行为保持不变,直到FielEvices成功执行。因为在服务器重新启动时,您可能会遇到时钟超过下一个计划时间的问题。更糟糕的是,它设法精确地达到了-1毫秒,
任务。延迟永远不会结束。一个可能的问题是,它是另一种“任务”。taskschd.msc调度命令行和可执行类型的任务。任务并行库用于可调用的任务,如函数、方法、子例程等。准确地说,再加上使用Windows调度程序,意味着从现在到永远,我(或者说,其他人)必须手动配置数千个调度more@RBarryYoung没什么不同。您需要每天运行一些代码,而任务调度器可以做到这一点。即使你需要你的应用专门做一些事情,比如改变它在内存中的状态,你仍然可以使用任务调度器在你的初始应用中触发webApi端点。我真的不喜欢任务调度器用于此操作的想法,它的伸缩性不好,并且依赖于手动设置,这会给本来自动的部署管道带来风险。我想我可以用Powershell编写脚本,但我不希望这样,因为这是团队中并非每个人都具备的技能。@详细信息,有什么可以证明它是一个更好的解决方案吗?我确实考虑并开始使用计时器来实现一个解决方案,但对我来说,异步等待方法似乎更干净,而且是我热衷于在团队中推广的模式。在封面下,我有点想知道他们是否都在做相对相同的事情……任务。延迟确实会在后台启动计时器。就资源消耗和解除阻塞线程而言,处理是相同的。我不确定我是否会用“更好”这个词来描述这两种方法。嗨,谢谢,这正是我想要的。我可以很容易地恢复状态,并且我有代码可以检测错过的时间表,并“延迟”重播它们,只要它们没有通过截止日期。错过的时间表实际上是可以的,显然不是永久性的,但一次性的并不是问题。我主要担心等待延迟的线程会退出或变得“过时”,或者持续时间(天)会导致错误,或者出于某种原因是不可取的。这是一个好问题,但这不是一个问题。