我有一个Winforms应用程序,它工作正常..使用BackgroundWorkerThread在串行数据处理过程中管理GUI可用性。后台工作者和跨线程问题
它工作正常。
现在,我添加一个新的方法,并复制我以其他形式做的事情。但我得到一个交叉线程异常。
我宣布我的BWT这样的:
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += DownloadGpsDataFromDevice;
bw.WorkerReportsProgress = true;
bw.RunWorkerAsync();
那么我delared这样的方法,它不工作背景:
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();
}
}
这已经工作了很长时间。我不相信错误在那里。我想我可能只是在电话中缺少一些东西?
这些行似乎行得通......或者我得到一个错误的错误?它在Common.WriteLog(“提取原始GPS数据。发送LL。”)上崩溃; – Craig 2011-06-12 03:51:31
等等......你说得对,看来!该应用程序在LogLine上崩溃,但是当我注释掉你提到的那些行时......它就会起作用。奇怪的是,它在日志行上崩溃了。谢谢! – Craig 2011-06-12 03:53:33
@cdotlister'WriteLog()'对我来说似乎没问题,不应该引起跨线程异常。在这种情况下我不确定。 – 2011-06-12 03:54:16