小编Ted*_*fer的帖子

WPF:从后台线程发布更新UI

我的代码启动了一个后台线程.后台线程进行更改并希望主线程中的UI更新.启动线程然后等待的代码看起来像:

                Thread fThread = new Thread(new ThreadStart(PerformSync));

                fThread.IsBackground = true;
                fThread.Start();

                fThread.Join();

                MessageBox.Show("Synchronization complete");
Run Code Online (Sandbox Code Playgroud)

当后台想要更新UI时,它会设置一个StatusMessage并调用以下代码:

    static StatusMessage _statusMessage;
    public delegate void AddStatusDelegate();
    private void AddStatus()
    {
        AddStatusDelegate methodForUIThread = delegate
        {
            _statusMessageList.Add(_statusMessage);
        };

        this.Dispatcher.BeginInvoke(methodForUIThread, System.Windows.Threading.DispatcherPriority.Send);
    }
Run Code Online (Sandbox Code Playgroud)

_statusMessageList是一个ObservableCollection,它是ListBox的源.

调用AddStatus方法但主线程上的代码永远不会执行 - 也就是说,在执行线程时,_statusMessage不会添加到_statusMessageList.但是,一旦完成(fThread.Join()返回),就会执行主线程上的所有堆叠调用.

但是,如果我在调用fThread.Start()和fThread.Join()之间显示一个消息框,则状态消息会正确更新.

在等待线程终止时,我需要更改以便主线程中的代码执行(UI更新)?

谢谢.

wpf multithreading

3
推荐指数
1
解决办法
3661
查看次数

标签 统计

multithreading ×1

wpf ×1