相关疑难解决方法(0)

从另一个线程更新ObservableCollection的最佳方法是什么?

我正在使用BackgroundWorker更新,ObservableCollection但它给出了这个错误:

"这种类型CollectionView不支持SourceCollection从与Dispatcher线程不同的线程对其进行更改 ."

用最少的工作量来解决这个问题的最佳和最优雅的方法是什么.我不想写低级别的基于锁的多线程代码.

我在网上看到了一些解决方案,但它们已有几年的历史了,所以不确定解决这个问题的最新共识是什么.

.net c# parallel-processing multithreading observablecollection

32
推荐指数
2
解决办法
3万
查看次数

快速执行和线程安全的可观察集合

ObservableCollection为每个对它们执行的操作发出通知.首先,他们没有批量添加或删除调用,其次他们不是线程安全的.

这不会让他们变慢吗?我们有更快的选择吗?有人说ICollectionView缠得ObservableCollection很快?这种说法有多正确.

wpf observablecollection thread-safety icollectionview

26
推荐指数
2
解决办法
2万
查看次数

升级到.NET 4.5:ItemsControl与其项目源不一致

我正在构建一个应用程序,它使用许多ItemControls(datagrids和listviews).为了从后台线程轻松更新这些列表,我将此扩展用于ObservableCollections,它运行良好:

http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx

今天我安装了VS12(后来安装了.NET 4.5),因为我想使用为.NET 4.5编写的组件.在将我的项目升级到.NET 4.5(从4.0)之前,我的数据网格从workerthread更新时开始抛出InvalidOperationException.异常消息:

抛出此异常是因为控件'System.Windows.Controls.DataGrid Items.Count:5'的名称为'(未命名)'的生成器已收到与Items集合的当前状态不一致的CollectionChanged事件序列.检测到以下差异:累计计数4与实际计数5不同.[累计计数为(上次重置时计数+ #Adds - 自上次重置后自上次复位).

Repro代码:

XAML:

<Window x:Class="Test1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
   <Grid>
      <DataGrid ItemsSource="{Binding Items, Mode=OneTime}" PresentationTraceSources.TraceLevel="High"/>       
   </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

码:

public partial class MainWindow : Window
{
    public ExtendedObservableCollection<int> Items { get; private set; }

    public MainWindow()
    {
        InitializeComponent();
        Items = new ExtendedObservableCollection<int>();
        DataContext = this;
        Loaded += MainWindow_Loaded;
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
            Task.Factory.StartNew(() =>
            {
                foreach (var item in Enumerable.Range(1, 500))
                {
                    Items.Add(item);
                }
            });                
    }
}
Run Code Online (Sandbox Code Playgroud)

c# wpfdatagrid .net-4.5

26
推荐指数
3
解决办法
2万
查看次数

如何使用数据绑定进行处理并保持GUI刷新?

问题的历史

这是我之前的问题的延续

如何启动线程以保持GUI刷新?

但是,由于Jon对这个问题有了新的认识,我将不得不完全重写原始问题,这会使该主题难以理解.所以,新的,非常具体的问题.

问题

两件:

  • CPU饥饿的重量级处理作为库(后端)
  • 带数据绑定的WPF GUI,用作处理的监视器(前端)

当前情况 - 库发送了很多关于数据更改的通知,尽管它在自己的线程中工作,它完全阻塞了WPF数据绑定机制,结果不仅监视数据不起作用(它没有刷新),但整个GUI被冻结在处理数据时.

目标 - 精心设计,抛光的方式使GUI保持最新 - 我并不是说它应该立即显示数据(它甚至可以跳过一些变化),但它在计算时不能冻结.

这是简化的示例,但它显示了问题.

XAML部分:

    <StackPanel Orientation="Vertical">
        <Button Click="Button_Click">Start</Button>
        <TextBlock Text="{Binding Path=Counter}"/>
    </StackPanel>
Run Code Online (Sandbox Code Playgroud)

C#部分(请注意这是一个代码,但有两个部分):

public partial class MainWindow : Window,INotifyPropertyChanged
{
    // GUI part
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var thread = new Thread(doProcessing);
        thread.IsBackground = true;
        thread.Start();
    }

    // this is non-GUI part -- do not mess with GUI here
    public event PropertyChangedEventHandler PropertyChanged; …
Run Code Online (Sandbox Code Playgroud)

c# data-binding wpf multithreading

14
推荐指数
1
解决办法
1万
查看次数