使用被动扩展按计划运行任务

时间:2013-08-13 11:35:20

标签: c# .net timer scheduled-tasks system.reactive

我已经看过很多例子,展示了如何通过计时器使用RX框架来运行任务,例如,

var timer = Observable
            .Timer(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(3))
            .Subscribe(q =>
                {   
                    Console.WriteLine("do something here " + q);
                });

我想知道是否可能,如果是的话,我如何使用RX框架按计划运行任务,例如每天午夜12点。

2 个答案:

答案 0 :(得分:5)

你所写的基本上就是它。使用Timer重载,开始时间为DateTimeOffset

DateTimeOffset startTime = midnight;
TimeSpan interval = TimeSpan.FromDays(1);

var timer = Observable.Timer(startTime, interval).Subscribe(q => Console.WriteLine("do something"));

答案 1 :(得分:3)

尽管我喜欢RX,但我怀疑这是这项工作的错误工具。你想要的是Windows Task Schedular这是一个操作系统服务。这有点像Unix cron服务。您将计划编写为XML文件,例如

<?xml version="1.0" ?>
<!--
This sample schedules a task to start on a daily basis.
-->
<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
    <RegistrationInfo>
        <Date>2005-10-11T13:21:17-08:00</Date>
        <Author>AuthorName</Author>
        <Version>1.0.0</Version>
        <Description>Notepad starts every day.</Description>
    </RegistrationInfo>
    <Triggers>
        <CalendarTrigger>
            <StartBoundary>2005-10-11T13:21:17-08:00</StartBoundary>
            <EndBoundary>2006-01-01T00:00:00-08:00</EndBoundary>
            <Repetition>
                <Interval>PT1M</Interval>
                <Duration>PT4M</Duration>
            </Repetition>
            <ScheduleByDay>
                <DaysInterval>1</DaysInterval>
            </ScheduleByDay>
        </CalendarTrigger>
    </Triggers>
    <Principals>
        <Principal>
            <UserId>Administrator</UserId>
            <LogonType>InteractiveToken</LogonType>
        </Principal>
    </Principals>
    <Settings>
        <Enabled>true</Enabled>
        <AllowStartOnDemand>true</AllowStartOnDemand>
        <AllowHardTerminate>true</AllowHardTerminate>
    </Settings>
    <Actions>
        <Exec>
            <Command>notepad.exe</Command>
        </Exec>
    </Actions>
</Task>

schedule daily notepad.exe运行运行。显然,您可以用您选择的应用程序替换notepade.exe,包括用C#编写的应用程序。

为什么不使用RX来做到这一点。鉴于这是一个需要非常长时间运行并且不会崩溃的应用程序,最好将其委托给由OS控制的专用服务。