c# 服务 长时间 运行后 自动停止了......*****************************大拿们***********************
private System.Threading.Thread timerlisten;
private Hashtable fileInfos ;
private Hashtable traverse;
protected override void OnStart(string[] args)
{
fileInfos = new Hashtable();
traverse = new Hashtable();
timerlisten = new System.Threading.Thread(
new System.Threading.ThreadStart(monitor));
timerlisten.Start();
FileSystemWatcher curWatcher = new FileSystemWatcher();
curWatcher.BeginInit();
curWatcher.IncludeSubdirectories = true ;
curWatcher.Path = System.Configuration.ConfigurationSettings.AppSettings["FileMonitorDirectory"];
//curWatcher.Changed += new FileSystemEventHandler(OnFileChanged);
curWatcher.Created += new FileSystemEventHandler(OnFileCreated);
//curWatcher.Deleted += new FileSystemEventHandler(OnFileDeleted);
//curWatcher.Renamed += new RenamedEventHandler(OnFileRenamed);
curWatcher.EnableRaisingEvents = true;
curWatcher.EndInit();
}
private void OnFileCreated(Object source, FileSystemEventArgs e)
{
if (servicePaused == false)
{
if (!timerlisten.IsAlive)
{
//当有文件创建时,如果检测线程没有运行,那么开启
timerlisten.Start();
}
lock (fileInfos)
{
FileInfo myfile;
try
{
myfile = new FileInfo(e.FullPath);
}
catch
{
//遇到所有异常此次获取文件信息操作均停止
return;
}
string filter = System.Configuration.ConfigurationSettings.AppSettings["filter"];
if (myfile.FullName.IndexOf(filter ) == -1)
{
//如果上传的文件不是有upload标识的,不加入hashtable中
return;
}
string fileLength;
try
{
fileLength = myfile.Length.ToString();
}
catch (IOException)
{
return;
}
fileInfos[myfile.FullName] = fileLength;
traverse[myfile.FullName] = fileLength;
}
}
}
AutoResetEvent events;
protected void monitor()
{
events = new AutoResetEvent(false);
WaitCallback wait = new WaitCallback(startagain);
try
{
ThreadPool.QueueUserWorkItem(wait, events);
}
catch
{
return;
}
if (events.WaitOne(-1, true))
{
Thread.Sleep(1000);
events.Close();
monitor();
}
}
void startagain(object obj)
{
if (servicePaused == false)
{
lock (fileInfos)
{
if (fileInfos.Count == 0)
{
events.Set();
return;
}
IDictionaryEnumerator idE = fileInfos.GetEnumerator();
try
{
while (idE.MoveNext())
{
string oldFile;
string currentFileLength;
FileInfo currentFile;
try
{
if (!traverse.ContainsKey(idE.Key))
{
//如果此键已被处理,则跳出此次操作
continue;
}
else
{
oldFile = traverse[idE.Key].ToString();
}
}
catch (ArgumentNullException )
{
continue;
}
System.Threading.Thread.Sleep(2500);
try
{
currentFile = new FileInfo(idE.Key.ToString());
currentFileLength = currentFile.Length.ToString();
}
catch (FileNotFoundException)
{
traverse.Remove(idE.Key);
continue;
}
if (oldFile == currentFileLength)
{
try
{
currentFile.MoveTo(currentFile.FullName.Replace("upload", ""));
}
catch
{
//意外获取到2次的大小都一样,但是文件还是没传输完,捕获此异常,跳出循环体
continue;
}
traverse.Remove(idE.Key);
}
else
{
traverse[idE.Key] = currentFile.Length.ToString();
}
if (traverse.Count == 0)
{
try
{
fileInfos.Clear();
}
catch
{
break;
}
break;
}
}
}
catch (InvalidOperationException)
{
//枚举操作无效时,直接进入下次线程
events.Set();
}
}
events.Set();
}
else
{
events.Set();
}
}
目的是为了监测文件夹内文件是否是完整的,例如上传或下载进这个文件夹时,文件是不完整?完整了重命名
...全文
相关推荐
进程守护,自动启动已经停止的exe或服务
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
C#停止线程的方法
主要介绍了C#停止线程的方法,实例分析了C#正确停止线程的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
C#启动和停止某个Windows服务
C#程序 有时候我们的软件需要检测电脑中是否已经启动某个数据库,如MySQl Server,若是没启动,则自动启动之。 可以启动和停止某个Windows服务 如MySQL服务器、Oracle等
基于C#实现Windows服务状态启动和停止服务的方法
主要介绍了基于C#实现Windows服务状态启动和停止服务的方法,详细讲述了实现这一功能的具体步骤,代码简洁易懂,需要的朋友可以参考下
C#中定时器停止问题
C#中定时器停止问题,停止定时器必须要用Stop方法才行,不然依然会工作的。


