如何创建调度程序(例如,安排推文或api请求)

我有一个计划项目表,它们可能会安排在同一时间。 我想知道如何让它们在正确的时间执行:

我看到的问题是执行一个预定项目(如预定的推特post)需要API请求,这可能需要一两秒钟 – 可能更长。 如果我按顺序执行它们+同时有太多的预定项目,那么它们执行的时间可能是在预定的时间之后。

我将如何构建避免这些问题的“调度”系统? 任何提示,建议?

谢谢!

我会使用Windows服务来完成此任务。 然后,应使用BackgroundWorker进程异步调度每个项目。 这将允许所有计划的进程以异步方式快速启动,因此它们不会发生冲突,并且在开始之前不依赖于之前完成的进程。

您可能想要考虑Quartz.NET 。 在调度和任务执行方面为您提供了很大的灵活性。

除非您采取措施来利用所有IO操作所存在的异步API,否则您唯一的方法是使用许multithreading。 考虑.net ThreadPool,因为当排队太多工作项时,这会增加线程数。 这里有一个限制,因为ThreadPool相对缓慢地旋转额外的线程。 在持续超载的情况下,您的系统会呻吟。 就像我说的那样,解决这个问题的最佳方法是使用异步IO。

您可以在希望它们运行时将任务放在线程中:

public abstract class MyTask { public abstract void DoWork(); } // ... public void SomeTaskStarter() { MyTask task = SomeFactoryMethodToCreateATaskInstance(); new Thread(new ThreadStart(task.DoWork)).Start(); } 

MyTask是一个抽象类,表示要执行的任务,它定义了一个方法,DoWork()将执行您想要的任务。 SomeFactoryMethodToCreateATaskInstance()将构建一个任务的具体实例,您需要做的就是编写DoWork()来执行您需要执行的操作:

 public class Twitterer : MyTask { private string _tweet; public Twitterer(string tweet) { _tweet = tweet; } public override DoWork() { TwitterApi api = new TwitterApi(); // whatever api.PostTweet(tweet); } } 

你肯定会想要某种任务完成的动作。 无论你做什么,任务完成例程应该是线程安全的,并且如果你需要做任何UI-ish工作,应该通过BeginInvoke()/ EndInvoke()调用它。

SomeTaskStarter()最好从Windows服务调用,并且很可能包含一个参数,其中包含有关应该启动哪个任务的信息等。