私は.Net4.0C#Windowsサービスベース(Dropboxのような)アプリケーションを開発しています。このアプリケーションは継続的に実行され、コンテンツと更新を特定のフォルダーで監視し、データベースに変更を通知します。同様のクライアントアプリケーションは他のマシンにもインストールされます。これにより、ホスティングマシンの同じフォルダに対して適切な更新が実行されます。私は、複数のスレッドと再帰呼び出しを使用してアプリケーション全体を開発しました。これにより、変更の実行と通知が継続されます。アプリケーションは、3時間後に3時間正常に実行され、スタックオーバーフロー例外がスローされてクラッシュします。
具体的には、9つのスレッドがあり、そのうちのいくつかは次の仕事をします
1)threadFSWToDB-ファイルの変更(追加、名前の変更、削除)をDBに書き込みます。
2)threadDBToUploadLogList-他のクライアントがファイルをダウンロードするサーバー上にフォルダーを作成します。
3)threadDoUpload-Webサーバーにファイルをアップロードします。
4)threadDBToDownloadList-DBのポーリングによって実行される変更のリストをアップロードします。
私の質問は、これが実行可能な解決策なのか、それともアプリ全体のデザインを再検討する必要があるのかということです。はいの場合、上記のタスク(順次または並列)を実行するための最良の方法は何でしょうか。そして、このような本質的に終わりがなく継続的なタスクを実行するための最も基本的なアプローチは何ですか。
私のコードは以下の通りです、それが問題を明確にすることができるように私はどれだけ入れるべきかわかりません
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();
}
}
再帰が主な理由である場合、アプリケーションが1日か2回正常に実行され、その後上記の動作を示し始める理由