Backgroundworker停止工作

时间:2014-01-31 20:34:20

标签: c# wpf backgroundworker

我有一个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小时之间的任何地方都可以正常工作,直到最终我们看到“登录到数据库......”并且没有其他任何事情发生。没有更多的消息,没有例外(在目标机器上发布版本),没有数据库条目......等等。这种情况一直发生。

我一直在摸不着头脑。任何线索都会有所帮助,我有一些解决方法,但我真的很想知道发生了什么,所以我可以在将来避免这种情况。

由于

编辑回原始代码...认为最新的将有助于避免一些“你怎么知道它不解雇”的问题

0 个答案:

没有答案