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

bustersword bustersword 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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


目的是为了监测文件夹内文件是否是完整的,例如上传或下载进这个文件夹时,文件是不完整?完整了重命名
...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
bustersword
C# 111,128 成员 642,536 内容