程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET Compact Framework多線程環境下的UI異步刷新

.NET Compact Framework多線程環境下的UI異步刷新

編輯:關於.NET

在進行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異步調用voidMessageEvent(stringmsg)。這裡調用Invoke方法來進行線程安全的調用。調用參數使用Object[]來傳遞,因此程序可以傳遞任何信息,UI可以呈現任何信息只要Worker Thread能提供。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved