【问题标题】:Concurrency in multithreaded WPF/Silverlight/WP apps多线程 WPF/Silverlight/WP 应用程序中的并发性
【发布时间】:2013-04-24 08:07:29
【问题描述】:

考虑以下代码:

int lastItemIndex = m_listbox.ItemsSource.Count - 1;
var groupItem = m_listbox.ItemsSource[lastItemIndex] as GroupedObservableCollection<ScheduleItem, DateTime>;

在像WPF/Silverlight/WP这样的多线程环境中,有没有什么办法可以保证lastItemIndex真的是第二行的最后一个item的索引?

【问题讨论】:

    标签: c# wpf multithreading concurrency windows-phone-8


    【解决方案1】:

    WPF 以及大多数其他 UI 框架默认是单线程的。多线程只有在您明确执行时才会发生。

    一般来说,您不应修改其他线程中 UI 控件可访问的集合 - 您可以使用 Invoke 将您的修改请求编组到主线程并在那里执行。这样一来,集合将始终只能从主线程访问和修改,并且您不会遇到并发问题。

    【讨论】:

    • 假设我有一个命令在另一个线程中运行,要求调度程序调用添加到列表框。我可以绝对确定该任务不会出现在这两行之间吗?
    • 您的请求将被放入消息队列中,由单个线程按顺序处理。因此,如果您使用主线程调度程序,则在任何时候最多只能执行一个请求,并且 lastItemIndex 不会在行之间更改。
    • 什么是请求?
    • 但是对于在主线程中运行的普通UI代码,只要我不做线程,事件是否被认为是请求并在不中断的情况下(在同一线程中)处理。Sleep?
    • 如果您执行 Thread.Sleep,它将在没有中断事件的情况下执行。如果您使用 async/await 模式,它可能会“中断”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2011-03-13
    • 1970-01-01
    • 2011-05-01
    相关资源
    最近更新 更多