c# - 当 WPF 中的大量 UI 更新时,ProgressRing 卡住了?

标签 c# wpf multithreading mvvm

Window 中有一个TreeView。我想在事件中从 ItemsSource 加载 TreeViewItems,同时显示 ProgressRing(MahApps.Metro.Controls)。

但是 ProgressRing 总是卡住。

我用多线程&Dispatcher进程加载ItemsSource,也不行。

XAML:

...
<Button Name="startButton" Content="Start" Click="Start"/>
<controls:ProgressRing x:Name="p1" IsActive="False"></controls:ProgressRing>
<TreeView x:Name="treeView1"></TreeView>
...

CS:

private void Start(object sender, EventArgs e)
{
    TreeViewItem root = new TreeViewItem() { Header = "Root", IsExpanded = true };
    treeView1.Items.Add(root);

    p1.IsActive = true;

    Thread thread = new Thread(() =>
    {
        // Main work
        InitTree(root, "D:\\");

        startButton.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle,
        (ThreadStart)delegate() {
            p1.IsActive = false;
        });
    });

    thread.Start();
}

private void InitTree(TreeViewItem item, string dir)
{
    string[] dirs = Directory.GetDirectories(dir);

    foreach (string subdir in dirs)
    {
        startButton.Dispatcher.Invoke(DispatcherPriority.ApplicationIdle,
        (ThreadStart)delegate()
        {
            TreeViewItem subItem = new TreeViewItem() { Header = subdir, IsExpanded= true };
            item.Items.Add(subItem);
            InitTree(subItem, subdir);
        });
    }
}

我读过并试过的内容:
http://msdn.microsoft.com/en-us/library/ms741870(v=vs.110).aspx
专业WPF编程,第31章多线程

最佳答案

改变

foreach (string subdir in dirs)
{
    startButton.Dispatcher.Invoke(DispatcherPriority.ApplicationIdle,
    (ThreadStart)delegate()
    {
        TreeViewItem subItem = new TreeViewItem() { Header = subdir, IsExpanded= true };
        item.Items.Add(subItem);
        InitTree(subItem, subdir);
    });
}

foreach (string subdir in dirs)
{
    TreeViewItem subItem = new TreeViewItem() { Header = subdir, IsExpanded= true };

    startButton.Dispatcher.Invoke(DispatcherPriority.ApplicationIdle,
    (ThreadStart)delegate()
    {
        item.Items.Add(subItem);
    });

    InitTree(subItem, subdir);
}

会更好。

关于c# - 当 WPF 中的大量 UI 更新时,ProgressRing 卡住了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22394931/

相关文章:

c - 多线程初始化中的Unknown Segmentation Fault (Core Dumped)

java - 同步块(synchronized block)不会锁定

c# - 是否有可以帮助构建 Google map 链接的 C# API?

c# - 如何使用 ClrMD 正确处理非原始 ClrInstanceField 值?

c# - 当使用 RegionManager.RequestNavigate 方法添加 View 时,是否有任何方法可以从 Prism 区域中删除 View (按名称)?

c# - 信号量的多线程问题

c# - 为什么有些类型没有文字修饰符

c# - YouTube API v3在上传过程中引发异常

wpf - 如何使用 Caliburn Micro 从用户控件获取对窗口的引用

c# - WPF 命令行参数,一种聪明的方法?