c# 服务 长时间 运行后 自动停止了......*****************************大拿们***********************

bustersword 2011-07-11 09:38:47

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();
}
}


目的是为了监测文件夹内文件是否是完整的,例如上传或下载进这个文件夹时,文件是不完整?完整了重命名
...全文
266 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bustersword 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xuexiaodong2009 的回复:]

目的是为了监测文件夹内文件是否是完整的,例如上传或下载进这个文件夹时
还有必要使用服务??
检查你的服务多线程控制AutoResetEvent 是否正确??
系统日志没有错误码?
[/Quote]
使用服务,是为了每次启动自动启动....
功能虽小,但是没办法额,因为之前写了客户端
下载,没办法判断服务端文件是否完整的.
bustersword 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]

写个日志吧,记录一下,看卡在哪了
[/Quote]

恩.......貌似只能这样了,
问下,多个线程操作这的hashtable,感觉会出问题
??
bustersword 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 q107770540 的回复:]

you can create another windows service to watch over this one.
[/Quote]

....don't joke me - -
q107770540 2011-07-11
  • 打赏
  • 举报
回复
you can create another windows service to watch over this one.
bdmh 2011-07-11
  • 打赏
  • 举报
回复
写个日志吧,记录一下,看卡在哪了
xuexiaodong2009 2011-07-11
  • 打赏
  • 举报
回复
目的是为了监测文件夹内文件是否是完整的,例如上传或下载进这个文件夹时
还有必要使用服务??
检查你的服务多线程控制AutoResetEvent 是否正确??
系统日志没有错误码?

110,555

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧