基本的に、BackgroundWorkerコンポーネントを使用してFTPの場所からファイルをフェッチし、そこでのスレッドの安全性を保証する単純なデーモンの実装を開始しています。私は正しい方向に向かっているように感じますが、関連するテクノロジーに完全には精通していないため、アプリケーションのライフサイクル全体にあまり慣れていません。たとえば、処理方法がはっきりとわからないシナリオがあると言ってください。それでも、つまり、停止イベントをどうするか、ワーカーの実行中にサービスが停止した場合はどうなるかなどです。次のコードは、私が達成しようとしていることをほとんど表していないと思います。
#region Daemon Events
protected override void OnStart(string[] args)
{
this.transferBackgroundWorker.RunWorkerAsync();
}
protected override void OnStop()
{
this.transferBackgroundWorker.CancelAsync(); // Thanks Wolfwyrd!
}
#endregion
#region BackgroundWorker Events
private void transferBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.WorkerSupportsCancellation = true;
#region FTP Download
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(Daemon.FTP_HOST);
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
ftpRequest.Credentials = new NetworkCredential(Daemon.FTP_USER, Daemon.FTP_PASS);
FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
using(Stream ftpResponseStream = ftpResponse.GetResponseStream())
{
using (StreamWriter sw = File.CreateText(FILE_NAME))
{
sw.WriteLine(ftpResponseStream);
sw.Close();
}
ftpResponse.Close();
}
#endregion
e.Result = "DEBUG: Download complete" + ftpResponse.StatusDescription;
}
private void transferBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
EventLog.WriteEntry("Exception caught: " + e.Error.Message);
}
else
{
EventLog.WriteEntry(e.Result.ToString());
}
}
#endregion
ありとあらゆる提案を本当にいただければ幸いです。よろしくお願いします。
編集:FTPファイルのフェッチを再実装しました。