很抱歉,如果这是一个愚蠢的问题,但我对Windows服务并不熟悉,并希望确保我了解处理这种情况的正确方法。
我有一个Windows服务,用于监视文件,如果存在这些文件,它会处理它们。我正在查看旧的开发人员的代码,如果文件不存在,他们使用Thread.Sleep()。我知道这是不好的做法,并亲眼看到这会锁定服务。
这是我逻辑的简化示例:
private Task _processFilesTask;
private CancellationTokenSource _cancellationTokenSource;
public Start()
{
_cancellationTokenSource = new CancellationTokenSource();
_processFilesTask = Task.Run(() => DoWorkAsync(_cancellationTokenSource.Token))
}
public async Task DoWorkAsync(CancellationToken token)
{
while(!token.IsCancellationRequested)
{
ProcessFiles();
//await Task.Delay(10000);
}
}
public Stop()
{
_cancellationTokenSource.Cancel();
_processFilesTask.Wait();
}
private void ProcessFiles()
{
FileInfo xmlFile = new DirectoryInfo(Configs.Xml_Input_Path).GetFiles("*.xml").OrderBy(p => p.CreationTime).FirstOrDefault();
if(xmlFile != null)
{
//read xml
//write contents to db
//move document specified in xml to another file location
//delete xml
}
}
我的第一个问题:是否需要任何延迟或暂停?如果我没有任何暂停,那么此服务将不断查找远程服务器上的文件。这是我不得不担心的事情,还是一个非常轻量级的过程?
第二个问题:如果暂停而不是经常点击这个服务器会更好,这是一个更好的方法还是你会推荐什么?
public async Task DoWorkAsync(CancellationToken token)
{
while(!token.IsCancellationRequested)
{
ProcessFiles();
await Task.Delay(TimeSpan.FromMilliseconds(10000), token).ContinueWith(_processFilesTask=> { });
}
}
感谢您的帮助!
答案 0 :(得分:0)
您可以使用计时器检查所需的文件和文件夹。这是大纲。
在服务类中添加Timer(继承ServiceBase类的一个)
private System.Timers.Timer myTimer;
在OnStart方法中初始化计时器。
protected override void OnStart(string[] args)
{
// Set the Interval to 1 seconds (1000 milliseconds).
myTimer = new System.Timers.Timer(1000);
// Hook up the Elapsed event for the timer.
myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
myTimer.Enabled = true;
}
定义已过时的事件处理程序。
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
//Write your file handling logic here.
//Service will execute this code after every one second interval
//as set in OnStart method.
}