2010-01-26 43 views
4

我有一个计划项目表,他们可能被安排在同一时间。我想知道如何让他们在正确的时间执行时间:如何创建一个调度程序(例如安排推文或api请求)

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

我将如何去建立这个“调度”系统,以避免这些问题?任何提示,建议?

谢谢!

回答

4

我会使用Windows服务来完成此操作。然后使用BackgroundWorker进程异步调度每个项目。这将允许所有预定进程异步快速启动,因此它们不会相互冲突,并且不依赖于开始前的整理。

+0

我同意,这是更好地让框架处理线程。 – 2010-01-26 01:33:38

+0

所以,你会说这是一个好的过程: 1.进入数据库,获取这一分钟的计划项目 2.通过计划项目迭代,“启动”每个作为后台工作进程 3.睡眠直到下一分钟 4.重复? 并将此作为Windows服务运行? – rksprst 2010-01-26 01:59:06

+0

我会的。我还建议创建一个“国家经理”类的类来跟踪这一切。每个BackgroundWorker将能够独立报告其进度。所以你可以跟踪是否有任何独立的故障,消息等。 – 2010-01-26 03:04:12

1

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

3

你可能要考虑Quartz.NET。在计划和任务执行方面给你很大的灵活性。

0

你可以把任务线程,当你希望他们能够运行:

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服务调用,将最有可能包含有关应开始什么任务信息参数等

相关问题