小编Her*_*erm的帖子

ManualResetEvent WaitOne阻止我的CollectionView的所有者Thread

我编写了一个WPF WizardFramework,它使用一些在后台执行一些操作BackgroundWorker.在处理时,我必须更新ObservableCollection绑定到我的UI的内容.

对于这种情况,我写了一个ThreadableObservableCollection,它提供线程安全的方法Insert,RemoveRemoveAt.虽然我使用的是.NET 4.5,但如果BindingOperations.EnableCollectionSynchronization没有其他许多无效的访问异常,我就无法工作.我Collection看起来像:

  public class ThreadableObservableCollection<T> : ObservableCollection<T>
  {
    private readonly Dispatcher _dispatcher;
    public ThreadableObservableCollection()
    {
      _dispatcher = Dispatcher.CurrentDispatcher;
    }

    public void ThreadsafeInsert(int pos, T item, Action callback)
    {
      if (_dispatcher.CheckAccess())
      {
        Insert(pos, item);
        callback();
      }
      else
      {
        _dispatcher.Invoke(() =>
          {
            Insert(pos, item);
            callback();
          });
      }
    }

    [..]
  }
Run Code Online (Sandbox Code Playgroud)

这是按预期工作,而我在我的应用程序中使用向导.现在我正在使用NUnit为应用程序编写一些集成测试.

有一个监听器等待WizardViewModel完成它的工作并寻找一些在Steps-Collection中注入的页面.完成asyncrone工作后,我可以使用Validate来检查viewmodel状态.

不幸的是我正在使用a ManualResetEvent来等待向导关闭.这看起来如下:

  public class WizardValidator : IValidator, IDisposable
  {
    private WizardViewModel …
Run Code Online (Sandbox Code Playgroud)

c# wpf nunit dispatcher manualresetevent

6
推荐指数
1
解决办法
1610
查看次数

标签 统计

c# ×1

dispatcher ×1

manualresetevent ×1

nunit ×1

wpf ×1