我有一个WPF项目,它使用后台工作程序与一些外部硬件(测试和测量设备等)接口,写入本地文件,并在数据运行时将数据插入数据库。程序流程基本上是顺序的,后台工作人员使用的是保持GUI对用户可访问,并且之所以被选中是因为我之前没有遇到过使用它们的问题。我们进行测量,做一些事情,记录,然后重复。 GUI上有一个状态日志,可以显示消息。
所有这些都可以在几个小时内完美地工作,但是,最终,看起来用于写入数据库的后台工作者从不会调用DoWork。
BackgroundWorker DbLogWorker = new BackgroundWorker();
...
DbLogWorker.DoWork +=
new DoWorkEventHandler(DbLogWorker_DoWork);
DbLogWorker.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(
DbLogWorker_RunWorkerCompleted);
从其中一个硬件中检索数据,设置属性并触发通用属性已更改事件时,将调用ProcessScanData
(免责声明:因为我正在调查以查看最新情况,所以到处都有一些额外的代码):
private void Data_DataSetChanged(object pSender, EventArgs pArgs)
{
this.Test.ProcessScanData(OsaVm.Osa.Data.DataSet);
}
...
public void ProcessScanData(SortedList<double,double> pData)
{
...
RaiseLogEvent(MessageType.SystemGeneral, "Logging to database...");
DbLogWorker.RunWorkerAsync(new AsyncDbLogArgs(CurrentChannel, tempdate,
loss1, loss2, loss3,
CurrentTemperature, CurrentPressure, CurrentRoomTemp));
}
private void DbLogWorker_DoWork(object pSender, DoWorkEventArgs pArgs)
{
AsyncDbLogArgs args = (AsyncDbLogArgs)pArgs.Argument;
string filename = string.Empty;
try
{
long datakey = Db.LogScan(CurrentChannel, args.Time,
args.Temperature, args.Pressure, args.RoomTemperature,
args.Loss1, args.Loss2, args.Loss3);
filename = args.Time.ToString(FOLDER_DATETIME_FORMAT) + "_[" + datakey.ToString() + "]";
}
catch (Exception ex)
{
filename = args.Time.ToString(FOLDER_DATETIME_FORMAT) + "_{" + (fileindex++) + "}";
}
pArgs.Result = new Tuple<AsyncDbLogArgs, string>(args, filename);
}
症状: 在1小时到16小时之间的任何地方都可以正常工作,直到最终我们看到“登录到数据库......”并且没有其他任何事情发生。没有更多的消息,没有例外(在目标机器上发布版本),没有数据库条目......等等。这种情况一直发生。
我一直在摸不着头脑。任何线索都会有所帮助,我有一些解决方法,但我真的很想知道发生了什么,所以我可以在将来避免这种情况。
由于
编辑回原始代码...认为最新的将有助于避免一些“你怎么知道它不解雇”的问题