我已经看过很多例子,展示了如何通过计时器使用RX框架来运行任务,例如,
var timer = Observable
.Timer(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(3))
.Subscribe(q =>
{
Console.WriteLine("do something here " + q);
});
我想知道是否可能,如果是的话,我如何使用RX框架按计划运行任务,例如每天午夜12点。
答案 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控制的专用服务。