zoukankan      html  css  js  c++  java
  • WPF 线程操纵UI问题

    WPF只允许UI线程修改UI,其他线程必须通过Invoke、委托(安全性)
    Winform可以开启/关闭“只允许UI线程修改UI”

    在WPF中非UI线程修改UI的方法:Dispatcher

    非UI线程直接修改UI,会报错

    System.InvalidOperationException:“调用线程无法访问此对象,因为另一个线程拥有该对象。”
    

    正确的做法是使用Dispatcher
    Dispatcher简单暴力,适合小工作量的修改一些界面内容
    长期后台工作应该考虑使用BackgroundWorker,有很多相关功能库

    Task t = new Task(() =>
    {
    	//wrong
    	//NameLabel.Content = "我用非UI线程修改NameLabel的文字,失败了";
    
    	NameLabel.Dispatcher.Invoke(new Action(delegate
    	{
    		NameLabel.Content = "我用UI线程修改了NameLabel的文字";
    	}));
    	Thread.Sleep(5000);
    	this.Dispatcher.Invoke(new Action(() =>
    	{
    		NameLabel.Content = "我用UI线程修改了NameLabel的文字-2";
    	}));
    	Thread.Sleep(5000);
    	this.Dispatcher.BeginInvoke(new Action(() =>
    	{
    		NameLabel.Content = "我用UI线程修改了NameLabel的文字-3";
    	}));
    });
    t.Start();

    Dispatcher使用一个专用的 UI 线程来完成界面的操作和更新,这个线程会关联一个唯一的WPF Dispatcher 对象,用于调度按优先顺序排列的工作项队列。Application.Run() 实际上就是对 Dispatcher.Run() 的间接调用。

    WPF Dispatcher通过循环来处理工作项队列,这个循环通常被成为 "帧 (DispatcherFrame)"。Dispatcher.Run() 创建并启动这个帧,这也是 Application.Run() 启动消息循环的最终途径。

    参考资料

    线程处理模型

    示例代码

    ChangeUI

  • 相关阅读:
    109. 有序链表转换二叉搜索树
    108. 将有序数组转换为二叉搜索树
    235. 二叉搜索树的最近公共祖先
    538. 把二叉搜索树转换为累加树
    230. 二叉搜索树中第K小的元素
    669. 修剪二叉搜索树
    513. 找树左下角的值
    637. 二叉树的层平均值
    671. 二叉树中第二小的节点
    DDL-Oracle中的5种约束总结(未完待续)
  • 原文地址:https://www.cnblogs.com/Lulus/p/8145717.html
Copyright © 2011-2022 走看看