我正在开发一个基于 .Net 4.0 C# Windows 服务(类似 Dropbox)的应用程序,该应用程序连续运行并监视特定文件夹的内容和更新,并通知数据库的更改,类似的客户端应用程序也将安装在其他机器上它将对其主机中的同一文件夹执行适当的更新。我已经开发了具有多个线程和递归调用的整个应用程序,它们将继续执行并通知更改。应用程序在 3 小时后运行良好 3 小时,它引发堆栈溢出异常并崩溃。
更具体地说,我有 9 个线程,其中一些线程执行以下工作
1) threadFSWToDB - 将任何文件更改(添加、重命名、删除)写入 DB。
2) threadDBToUploadLogList - 在服务器上创建一个文件夹,其他客户端将从那里下载文件。
3) threadDoUpload - 将文件上传到网络服务器。
4) threadDBToDownloadList - 将通过轮询数据库上传要执行的更改列表。
我的问题是,这是可行的解决方案还是我需要重新考虑整个应用程序的设计。如果是,那么执行上述任务(顺序或并行)的最佳方式是什么。什么是执行像这样的永无止境和连续的任务的最基本方法。
我的代码如下,我不知道要放多少才能把事情弄清楚
Thread threadFSWToDB = new Thread(() => WriteFSWLogListToDatabase());
private static void WriteFSWLogListToDatabase()
{
try
{
using (var objEntities = new ShareBoxEntities()) // EF class instantiation
{
// this DB class constructor call later on throws stack overflow exception not necessarily from this method
var objConnector = new DBConnector(objEntities);
var objConnector = new DBConnector();
List<string> directories = objConnector.GetAllSharedDirectoryRelativePaths();
if (FSWLogList != null && FSWLogList.Count() > 0)
{
for (int i = 0; i <= FSWLogList.Count - 1; i++)
{
// some file changes being written to Database
FSWLogList[i].SavedInDB = true;
}
}
}
}
}
catch (Exception ex)
{
// write to event log and mail to administrator
}
finally
{
if (FSWLogList != null && FSWLogList.Count > 0)
{
FSWLogList.RemoveAll(item => item.SavedInDB == true);
}
Thread.Sleep(5000);
WriteFSWLogListToDatabase();
}
}
如果递归是主要原因,那么为什么应用程序在一两天内运行良好,然后开始表现出上述行为