博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET Compact Framework 多线程环境下的UI异步刷新
阅读量:7188 次
发布时间:2019-06-29

本文共 1635 字,大约阅读时间需要 5 分钟。

在进行WinCe或者Windows Mobile开发中,通常需要把一些任务提交给工作线程(Worker Thread)完成,当worker thread 线程发生状态变更的时候需要通知UI进程刷新UI,比如一个网络连接程序,Worker Thread线程负责管理WiFi,GPRS或者3G等连接,当连接状态发生改变时候,Worker Thread把更新状态通知UI Thread,而UI Thread更新UI通知用户。

这里常常有个疑问,为什么Worker Thread不直接更新UI,这样更简单直接和明了。但是UI刷新不是线程安全(Thread Safe)的,所以Worker Thread直接更新UI会抛出"cross-thread operation not valid"异常。所以需要Thread Safe的通知方法,下面演示更新短语(Message)的方法如下:

Worker Thread Class

 

class
 ConnectionMgr
{
    
//
Delegate for Message
    
public
 
delegate
 
void
 MessageEventHandler(
string
 msg);
    
public
 
event
 MessageEventHandler MessageEvent;
    
//
the delegate of Message event
    
private
 
void
 MessageHandler(
string
 msg)
    {
        MessageEventHandler messageEvent 
=
 MessageEvent;
        
if
 (messageEvent 
!=
 
null
)
        {
            messageEvent(msg);
        }
    }
    
    
private
 
void
 ConnectHandler()
    {
        MessageHandler(
"
Connected
"
);
    }
    
    
private
 
void
 DisconnectHandler()
    {
        MessageHandler(
"
Disconnected
"
);
    }
}

在Worker Thread定义delegate和event供UI Thread注册。当状态发生改变是调用该delegate。

 

UI Thread

 

public
 
partial
 
class
 Form1 : Form
{
    
public
 Form1()
    {
        
//
register the connect event
        ConnectionMgr.Instance.MessageEvent 
+=
 MessageEvent;
    }
    
private
 
void
 MessageEvent(
string
 msg)
    {
        SafeWinFormsThreadDelegate d 
=
 
new
 SafeWinFormsThreadDelegate(ShowMessage);
        Invoke(d, 
new
 
object
[] { msg} ); 
    }
    
public
 
delegate
 
void
 SafeWinFormsThreadDelegate(
string
 msg);
    
private
 
void
 ShowMessage(
string
 msg)
    {
        eventText.Text 
=
 msg;
    }
}

UI Thread通过delegate订阅连接事件,当连接状态发生改变的时候,Worker Thread异步调用void MessageEvent(string msg)。这里调用方法来进行线程安全的调用。调用参数使用Object[]来传递,因此程序可以传递任何信息,UI可以呈现任何信息只要Worker Thread能提供。

 

参考文献

 

    本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/01/20/1378648.html,如需转载请自行联系原作者

你可能感兴趣的文章
iOS开发必备HUD(透明指示层)
查看>>
mysql删除大表的部分数据
查看>>
Linux内核升级
查看>>
java枚举常用配置
查看>>
本人的性格弱点
查看>>
C#实现一维小波变换
查看>>
PHP内核定义变量的方式
查看>>
hadoop零散笔记
查看>>
uboot移植——uboot启动回顾
查看>>
分段机制和分页机制
查看>>
三天学会HTML5 之第一天
查看>>
学习《计算机网络》思路总结
查看>>
Jquery对象与DOM对象的转换
查看>>
IM设计思考:点对点消息交换
查看>>
Java 线程池框架核心代码分析
查看>>
Xpath语法
查看>>
接地气又好用,8 款优秀的国产开源博客系统推荐
查看>>
pg_class的reltablespace字段含义
查看>>
unity简介
查看>>
nginx中try_files参数易被忽略的知识点
查看>>