【问题标题】:How Create a Scheduler (e.g. to schedule tweets, or an api request)如何创建调度程序(例如调度推文或 api 请求)
【发布时间】:2011-01-09 08:50:21
【问题描述】:

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

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

我将如何构建这个避免这些问题的“调度”系统?有什么提示和建议吗?

谢谢!

【问题讨论】:

    标签: c# twitter scheduling scheduled-tasks


    【解决方案1】:

    我会使用 Windows 服务来完成此操作。然后应该使用 BackgroundWorker 进程异步调度每个项目。这将允许所有计划的进程快速异步启动,这样它们就不会发生冲突,也不会依赖于前一个进程在启动之前完成。

    【讨论】:

    • 我同意,最好让框架处理线程。
    • 那么,您认为这是一个很好的过程吗: 1. 转到数据库,获取这一分钟的预定项目 2. 遍历预定项目,将每个项目作为后台工作进程“启动” 3. 睡眠直到下一分钟 4. 重复?并将其作为 Windows 服务运行吗?
    • 我愿意。我还建议创建一个“状态管理器”类来跟踪这一切。每个 BackgroundWorker 都可以独立报告其进度。这样您就可以跟踪是否有任何独立的故障、消息等。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可能需要考虑Quartz.NET。在计划和任务执行方面为您提供很大的灵活性。

      【讨论】:

        【解决方案4】:

        当你想让它们运行时,你可以把它们放在线程中:

        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 相关的工作,可能应该通过 BeginInvoke()/EndInvoke() 调用。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-20
          相关资源
          最近更新 更多