控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

.NET Compact Framework 多线程环境下的UI异步刷新

作者:Jake Lin 出处:博客园 2010年01月26日 阅读:

在进行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)。这里调用Invoke方法来进行线程安全的调用。调用参数使用Object[]来传递,因此程序可以传递任何信息,UI可以呈现任何信息只要Worker Thread能提供。

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统