我有一个Winforms应用程序,它正常工作。在处理与设备的串行数据时,使用BackgroundWorkerThread来管理GUI的可用性。
它一切正常。
现在,我正在添加一个新方法,并复制我在其他表单中所做的操作。但是我遇到了跨线程异常。
我像这样声明我的BWT:
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += DownloadGpsDataFromDevice;
bw.WorkerReportsProgress = true;
bw.RunWorkerAsync();
我随后声明了一个方法,如下所示,该方法执行后台工作:
private void DownloadGpsDataFromDevice(object sender, DoWorkEventArgs e)
{
_performScreenUpdate = true;
tsStatus.Text = "Downloading GPS Data...";
Invalidate();
Refresh();
Common.WriteLog("Extracting raw GPS data. Sending LL.");
ReplyString raw = DeviceServices.ExecuteCommand("$LL");
DeviceServices.ExecuteCommand("$LL"); 是实际执行操作的代码,但我在前一行记录到文本文件时出现了异常。这可能让你担心——写入文件。然而,在另一个BWT中,我已经做过数千次这样的操作。
我使写入线程安全。以下是我的Common.WriteLog方法:
public static void WriteLog(string input)
{
lock (_lockObject)
{
WriteLogThreadSafe(input);
}
}
private static void WriteLogThreadSafe(string input)
{
Directory.CreateDirectory(LogFilePath);
StreamWriter w = File.AppendText(LogFilePath + @"\" + LogFileName);
try
{
w.WriteLine(string.Format("{0}\t{1}", DateTime.Now, input));
}
catch (Exception e)
{
System.Console.WriteLine("Error writing to log file!");
System.Console.WriteLine("Tried to write: [" + input + "]");
System.Console.WriteLine("Failed with error: [" + e.Message + "]");
}
finally
{
w.Close();
}
}
这个一直运行良好。我不认为错误出在那里。也许是在调用时我漏掉了什么东西?
WriteLog()
看起来没问题,不应该引起跨线程异常。在这种情况下我不确定。 - Bala R