线程操纵UI问题

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

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

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

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

正确的做法是

Task t = new Task(() =>
{
    NameLabel.Dispatcher.Invoke(new Action(delegate
    {
        NameLabel.Content = "我用UI线程修改了NameLabel的文字"; })); }); t.Start(); 
示例代码

https://github.com/zLulus/NotePractice/tree/dev3/WPF/WpfDemo/ChangeUI

补充:Dispatcher(调度员)

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

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

 
 
 
 

参考资料:
http://developer.51cto.com/art/200912/174005.htm

转载于:https://www.cnblogs.com/Lulus/p/8145717.html

### 鸿蒙开发中从Worker线程更新UI的方法 在鸿蒙操作系统下,由于主线程负责处理界面渲染和其他高优先级的任务,而耗时操作通常放在工作线程(即`Worker`)中执行。为了确保应用程序响应迅速且用户体验良好,在完成后台任务后需安全地通知主线程来刷新用户界面上的信息。 对于想要实现由Worker线程触发UI更新的情况,可以通过事件机制或者消息传递的方式来进行跨线程通讯[^1]。具体做法如下: - **建立双向通信渠道**:利用`postMessage()`函数向Worker发送指令以及通过设置监听器(`onmessage`)捕获来自Worker的数据反馈。 - **同步状态变化至主线程**:一旦接收到Worker返回的结果数据,则应立即将这些信息转发给视图层组件以便及时反映最新的业务逻辑变动情况;这一步骤往往涉及到调用特定框架所提供的APIs或自定义回调函数等手段。 下面给出一段简单的代码片段用于说明上述过程中的关键部分: ```javascript // 主线程端代码 import abilityFeature from '@ohos.application.abilityFeature'; function updateUIThread(data){ // 假设这里有一个方法可以直接修改页面上的某个元素的内容 document.getElementById("result").innerText = data; } const workerInstance = new Worker('path/to/your.worker.js'); workerInstance.onmessage = (event) => { let resultData = event.data.value; updateUIThread(resultData); // 调用此函数以更新UI }; // 发送启动信号给Worker做一些计算或其他异步任务 workerInstance.postMessage({'action':'start'}); ``` ```typescript // Worker文件内的JavaScript代码 self.onmessage = function(e){ switch(e.data.action){ case "start": doHeavyComputation().then((res)=>{ self.postMessage({"value": res}); }); break; default: console.log("Unknown action"); } }; async function doHeavyComputation(){ await someAsyncOperation(); return finalResult; } ``` 需要注意的是,直接在非UI线程上尝试更改任何与图形绘制有关的对象都是不允许的行为,因为这样可能会引起不可预知的应用崩溃风险或是其他异常现象的发生。因此总是要遵循正确的模式——仅允许主/UI线程操纵它所关联的可视化控件属性值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值