3

我有问题,ObservableCollection<T>使用(任务并行库)更新绑定到任务线程中的 WPF ListView

我有一个小工具读取编辑文件,并显示每个段的计数(一行的前三个字母)。

包含的段及其计数显示在列表框中。

Wenn 我最初加载文件一切正常,我看到 GUI 正在计算段数。我的程序允许切换到另一个文件,如果我这样做(使用完全相同的代码)它会失败并出现以下异常。

这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。

这是失败的代码

public class SegementLineCollection : ObservableCollection<SegmentLine>
  {
    public void IncrementCount(string Segment)
    {
      Segment = Segment.ToUpper();

      SegmentLine line;
      if (this.Select(x => x.SegmentName).Contains(Segment))
      {
        line = this.Where(x => x.SegmentName == Segment).FirstOrDefault();
      }
      else
      {
        line = new SegmentLine();
        line.SegmentName = Segment;

        this.Add(line); // <--- At this point comes the Exception
      }

      line.Count++;
    }
  }

这是我使用的 TPL 调用:

private string _FileName;
    public string FileName
    {
      get
      {
        return _FileName;
      }
      set
      {
        _FileName = value;
        OnPropertyChanged("FileName");

        if (!String.IsNullOrEmpty(value)) 
          new Task(() => StartFile()).Start();
      }
    }

有没有人对我有任何打击?

- - - - - - 编辑 - - - - - - - - -

使用 TaskScheduler.FromCurrentSynchronizationContext() 或 Dispatcher 提供的答案没有做到这一点!

加载新的绑定时更改绑定是否可以解决问题。

这是我使用的Binding,在ViewModel中切换了Reader Onject,并通过INotifyPropertyChanged实现通知了GUI

4

4 回答 4

1

使用调度程序访问集合:

if (Dispatcher.CurrentDispatcher.CheckAccess())
  this.Add(...)
else
  Dispatcher.CurrentDispatcher.Invoke(() => this.Add(...));
于 2012-04-24T06:56:15.567 回答
1

您需要在 GUI 线程上调用 IncrementCount。

使用 TPL,您可以TaskScheduler.FromCurrentSynchroniztionContext()在任务或延续中使用。

var task = new Task<string>(() => { return "segment"; })
var task2 = task.ContinueWith(t => IncrementCount(t.Result),
                              TaskScheduler.FromCurrentSynchroniztionContext());
task.Start();
于 2012-04-24T07:01:45.093 回答
0

当您在不同的线程上操作时,您需要使用它Dispatcher.BeginInvoke来对绑定到的集合运行更新UI

于 2012-04-24T06:55:50.377 回答
-2

我在以下博客中有解决此类问题的方法。

http://bathinenivenkatesh.blogspot.co.uk/2011/07/wpf-build-more-responsive-ui.html

它有详细的解释和代码片段......

于 2012-04-24T09:41:51.707 回答