0

当我迁移到 SQL Server Compact 3.5 时,它会在后台运行的线程中给出异常,并且每次它都会给我不同的异常,如下所示。

  1. An item with the same key has already been added.

  2. Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

  3. Attempted to read Data when Datareader is closed

这对我来说很烦人,因为它突然停止了我的应用程序..

请注意,当我的后台工作人员或任务计划程序在我的应用程序中运行时会发生这种情况,否则应用程序可以正常工作。

我不知道是我做错了还是只是因为 SQL Server Compact 3.5

有什么帮助可以解决我的问题吗?

谢谢..

编辑 使用工作单元。

在主线程中,我正在从存储库中收集 200 条记录

UnitOfWork _uow;
ObservableCollection<ViewModel> Colloection = new ObservableCollection<ViewModel>;
ObservableCollection<ViewModel> AllColloection = new ObservableCollection<ViewModel>;

public Class()
{
   Colloection  = _uow.Contacts.Getall().Select(s=> new ViewModel(s,_uow)).Take(200).ToList();
}

在后台工作者

AllColloection  =_uow.Contacts.Getall().Select(s=> new ViewModel(s,_uow)).ToList();

在收集 AllCollection 时,它给了我例外

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

最初我想显示 200 条记录,当用户单击下一步时,我正在从 Allcolloection 收集接下来的 200 条记录。

4

1 回答 1

2

看起来您在没有同步的不同线程之间共享 ADO .NET 对象(连接、命令、读取器等)。

在您的代码中添加一些同步:

private readonly _uowLock;

public Class()
{
    _uowLock = new object();

    // run any background threads

    // loading data in main thread
    LoadCollection();
}

private void LoadCollection()
{
    // obtain lock
    lock (_uowLock)
    {
        Collection  = _uow.Contacts.Getall().Select(s=> new ViewModel(s,_uow)).Take(200).ToList();
    }
}

// this should be called from background worker
private void LoadAllCollection()
{
    // obtain lock
    lock (_uowLock)
    {
        AllColloection  =_uow.Contacts.Getall().Select(s=> new ViewModel(s,_uow)).ToList();
    }
}

,或者不在线程之间共享 ADO .NET 对象 - 它们不是线程安全的:

public Class()
{
    // run any background threads

    // loading data in main thread
    LoadCollection();
}

private void LoadCollection()
{
    Collection  = new UnitOfWork().Contacts.Getall().Select(s=> new ViewModel(s,_uow)).Take(200).ToList();
}

// this should be called from background worker
private void LoadAllCollection()
{
    AllColloection  = new UnitOfWork().Contacts.Getall().Select(s=> new ViewModel(s,_uow)).ToList();
}
于 2013-08-22T05:26:33.100 回答