【发布时间】:2018-06-03 18:54:12
【问题描述】:
我有一个应用程序,它有一个等待事件(例如接收目录中的文件)并将该文件发布到 API 的主线程。这部分工作正常。
另一方面,由于某些原因,主线程可能会丢失一些文件。所以,我已经设置了一个后台线程来运行整个应用程序生命周期清理那些丢失的文件,如下所示:
public virtual void MissedFileHandler()
{
if (_missedFileHandlerThread == null || !_missedFileHandlerThread.IsAlive)
{
_missedFileHandlerThread = new Thread(new ThreadStart(ClearMissedFiles));
_missedFileHandlerThread.IsBackground = true;
_missedFileHandlerThread.Start();
}
}
protected virtual void ClearMissedFiles()
{
while (true)
{
string[] missedFiles = new string[] { };
missedFiles = Directory.GetFiles(ConfigurationHelper.applicationRootDirectory, "*.txt", SearchOption.TopDirectoryOnly);
Parallel.ForEach(missedFiless, (currentMissedFile) =>
{
bool isFileInUse = true;
isFileInUse = FileHelper.CheckIfFileInUse(filesInUseCollection, currentMissedFile)
if (!isFileInUse)
{
bool isHttpTransferSuccess = false;
isHttpTransferSuccess = FileHelper.SendFileToApi(userid, currentMissedFile);
if (isHttpTransferSuccess)
{
File.Delete(currentMissedFile);
}
}
});
Thread.Sleep(1000);
}
}
请注意,由于某些其他原因,不能将此作为 Windows 服务或调度程序运行。所以,我确实需要一个后台工作人员来定期清理丢失的文件。我检查了 Timer 和 WaitHandles 但不太确定如何使用它们来实现以下内容。
这两个进程(新文件的主要偶数处理程序和后台清理程序被调用的方式是,在主应用程序线程中,我将实例化类并在应用程序启动时调用方法。它是Thread.Sleep() 和@987654325 @ 这让我很困扰,正在寻找更好的方法。谢谢。
【问题讨论】:
-
使用文件观察器检测该目录中的新文件。
-
如果这个后台任务“有能力”做和主线程一样的工作,为什么他们都做这个工作?为什么不把它全部留给后台线程呢?
标签: c# multithreading while-loop