この静的ログ クラスを作成して、多くのスレッドですべてのステータスを記録しました。ときどき、(プログラムが書き込んでいる) ログ ファイルが占有されているという例外が発生しました。他のスレッドが同時にファイルを書き込んでいたようです。この例外を回避するために、このすべての作業を UI スレッドに呼び出しましたが、それでも発生します。なにか提案を?ありがとう。
ところで、lock(mLog) を使用してこの問題を回避できることはわかっていますが、なぜこれが発生するのか疑問に思っています。UI スレッドで 2 つの Log.UpdateLog 関数を同時に実行してはいけません。よろしいですか?
public partial class LogForm : Form
{
private StringBuilder mLog;
public LogForm()
{
InitializeComponent();
mLog = new StringBuilder();
}
public void Write(string msg, bool save)
{
mLog.Insert(0, msg + "\r\n\r\n" + "-----------------------------------------------------------------------" + "\r\n\r\n");
if (save)
{
SaveFile();
}
}
private void SaveFile()
{
FileStream file;
file = new FileStream(Application.StartupPath + @"\LOG.txt", FileMode.Create);
StreamWriter sw = new StreamWriter(file);
sw.Write(mLog.ToString());
sw.Close();
file.Close();
}
}
public static class Log
{
private delegate void mUIInvoke(string msg, bool save);
private static LogForm mLogForm = new LogForm();
public static void Write(string msg, bool save)
{
msg += "\r\nTIME:" + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
if (mLogForm.InvokeRequired)
{
mUIInvoke invoke = new mUIInvoke(UpdateLog);
mLogForm.BeginInvoke(invoke, new object[] { msg, save });
}
else
{
UpdateLog(msg, save);
}
}
private static void UpdateLog(string msg, bool save)
{
mLogForm.Write(msg, save);
}
}