我有一個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