新しいファイルのフォルダを監視するWindowsサービスを開発しました。私の問題は、例外が発生したときにサービスが機能しなくなることです。サービスの主な目的は: 1.ファイル作成のためのフォルダを見る 2.ファイルを読む 3.ファイルのデータをデータベースに挿入する 本当にやりたいことは、ファイルの挿入を緩めないことです!すべての新しいファイルを読み込み、そのデータをデータベースに挿入する必要があります。 "他のプロセスで使用されているため、 'c:\ newfile.txt'というファイルにアクセスできませんでした」などの例外が発生した場合、プロセスは停止します。Windowsサービスの例外 - 例外が発生したときにサービスが停止する
public partial class weatherService : ServiceBase
{
private FileSystemWatcher FSW;
private FswHandler Handler;
public weatherService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
FSW = new FileSystemWatcher("c:\\cvvv", "*.txt");
Handler = new FswHandler();
FSW.Created += Handler.OnEvent;
FSW.EnableRaisingEvents = true;
}
protected override void OnStop()
{
FSW.EnableRaisingEvents = false;
FSW.Dispose();
}
protected override void OnPause()
{
FSW.EnableRaisingEvents = false;
}
protected override void OnContinue()
{
FSW.EnableRaisingEvents = true;
}
}
そして、ハンドラのコードは次のとおりです:サービスのための私のコードがある
public class FswHandler
{
private string[] data;
private StreamReader reader;
private StreamWriter sw;
public void OnEvent(Object source, FileSystemEventArgs Args)
{
LogEvent(" [reading file] ");
readFile(Args.FullPath, Args.Name);
}
public void LogEvent(string msg) {
sw = new StreamWriter("C:\\Users\\Olga\\Desktop\\weatherlog.txt", true);
sw.WriteLine("Action : "+ msg +" occured in " + DateTime.Now.ToString());
sw.Close();
}
public void readFile(string path, string filename)
{
LogEvent(" [got in readFile] to read file " + filename);
try
{
reader = new StreamReader(path);
}
catch (Exception ex)
{
LogEvent(ex.Message);
}
try
{
reader = File.OpenText(path);
}
catch (Exception ex)
{
LogEvent(ex.Message);
}
string titlesLine;
string valuesLine;
LogEvent(" [getting 1st line] ");
titlesLine = reader.ReadLine();
LogEvent(" [getting 2nd line] ");
valuesLine = reader.ReadLine();
LogEvent(" [splitting 2nd line] ");
data = valuesLine.Split(new Char[] { ' ', '\t' });
LogEvent(" [starting inserting] ");
insData(filename);
reader.Close();
}
public void insData(string filename) {
string connString = "server=83.212.92.197;port=3306;database=mydata;uid=distusr;pwd=usdist1";
MySqlConnection conn = new MySqlConnection(connString);
MySqlCommand command = conn.CreateCommand();
DateTime cdt = System.DateTime.Now;
String.Format("{0:MM/dd/yyyy HH:mm:ss}", cdt);
string dt = cdt.ToString();
int space_pos = dt.IndexOf(" ");
string date = dt.Substring(0, space_pos);
string time = dt.Substring(space_pos+1, dt.Length-space_pos+1);
command.CommandText = "INSERT INTO datainput(filename, measDate, measTime, out2, out3, out4, out5, out6, out7, out8, out9, out10," +
"out11, out12, out13, out14, out15, out16, out17, out18, out19, out20," +
"out21, out22, out23, out24, out25, out26, out27, out28, out29, out30," +
"out31, out32, out33, out34, out35, out36, out37, out38, out39, out40," +
"out41, out42, out43) VALUES ('" + filename + "','" + date + "','" + time +
"','" + data[14] + "','" + data[15] + "','" + data[16] + "','" + data[17] + "'," +
"'" + data[18] + "','" + data[19] + "','" + data[20] + "','" + data[21] + "','" + data[22] +
"','" + data[23] + "'," + "'" + data[24] + "','" + data[25] + "','" + data[26] +
"','" + data[27] + "','" + data[28] + "'," +"'" + data[29] + "','" + data[30] +
"','" + data[31] + "','" + data[32] + "','" + data[33] + "'," + "'" + data[34] +
"','" + data[35] + "','" + data[36] + "','" + data[37] + "','" + data[38] + "'," +
"'" + data[39] + "','" + data[40] + "','" + data[41] + "','" + data[42] + "','" + data[43] +
"'," + "'" + data[44] + "','" + data[45] + "','" + data[46] + "','" + data[47] +
"','" + data[48] + "'," + "'" + data[49] + "','" + data[50] + "','" + data[51] +
"','" + data[52] + "','" + data[53] + "','" + data[54] + "','" + data[55] + "')";
LogEvent(" [opening database] ");
try{
conn.Open();
}
catch (Exception ex){
LogEvent(ex.Message);
}
LogEvent(" [executing query] ");
try
{
command.ExecuteNonQuery();
}
catch (Exception ex){
LogEvent(ex.Message);
}
LogEvent(" [data have been inserted] ");
conn.Close();
}
}
私は、ファイルを失うことを避けるために何ができますか?私も試しました
protected void DelayExecution(int nSeconds)
{
DateTime end = DateTime.UtcNow.AddSeconds (nSeconds);
while (DateTime.UtcNow < end){}
}
try
{
reader = File.OpenText(path);
}
catch (Exception ex)
{
LogEvent(ex.Message);
DelayExecution(2);
readFile(path, filename);
}
しかし、問題は残ります。この場合、関数を介して処理が開始され、プロセスはdbにデータを挿入し、[1行目]に戻ります。 LogEventを使用してサービスをデバッグすることができます。なぜなら、私は非常に多くのLogEventを実行しているからです。
すべてのヘルプは素晴らしいことだ...