基本的には、BackgroundWorkerコンポーネントの助けを借りてファイルをFTPの場所から取り出して、そこでスレッドの安全性を保証する簡単なデーモンを実装し始めています。私は正しい方向に向かっていると感じていますが、関連する技術に完全に精通しているわけではないので、アプリケーションのライフサイクル全体ではあまり簡単ではありません。たとえば、処理方法がわからないシナリオがありますまだ、すなわち、ストップイベントで何をすべきか、ワーカーが走っている間にサービスが停止されるとどうなるでしょうか?私は、次のコードは達成しようとしていることをほとんど意味していないと思います。Windows上でデーモンを取得するスレッドセーフな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ファイルのフェッチを再実装しました。
少し質問を明確にする必要があります。 Windowsサービスのライフサイクルについて質問していますか? FTPクライアントライブラリの作成方法についてスレッドについて?このシナリオに対するBackgroundWorkerの適用性について –
こんにちはVinko、あなたのコメントのために多くの感謝!私がしようとしているのは、Windows用のスレッドセーフなFTPファイルフェッチャーデーモンです。これは良い解決策だと思っていましたが、実際にはより良いアプローチを提案することをためらっていません! –