C#多线程 使用委托更新UI实例(WP7开发 其他线程中更新UI)(转载)
在C#中,非主线程(即非UI线程,就是通过new Thread创建的线程)是不能直接操作UI元素的,Android中也一样,必须通过Handler与UI线程通讯,通知UI线程更新.而C#则采用委托的方式更新UI.下面用一个简单的实例来说明.这是一个WPF项目,只有一个名为textBlock1的TextBlock用于显示,一个名为button1的Button用于开启新线程来更新textBlock1.新线程执行的内容是0-100循环,而让textBlock1显示当前循环的进度.Windows Phone 7开发中,也通用,参考
上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Threading; namespace WpfApplication2 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { delegate void DelegateTest(int i); //使用delegate关键字,声明委托类型,参数和返回值都有要求,见下面说明 DelegateTest delegateTest; //声明委托类型所对应的委托 public MainWindow() { InitializeComponent(); } public void SetText(int i) { //更新UI的方法 textBlock1.Text = i.ToString(); } private void button1_Click(object sender, RoutedEventArgs e) { delegateTest = SetText; //实例化委托,就是添加委托要执行的方法, //可以用+=添加多个方法,如下面再增加 delegateTest +=方法名; //添加的方法,返回值和参数列表 必须与委托类型结构相同 //即这里DelegateTest与SetText参数都为int,返回值都为void Thread t = new Thread(new ThreadStart(ThreadProc)); //开线程方法与Java有些不同 t.Start(); //执行一个新线程 } public void ThreadProc() { for (int i = 0; i < 100; i++) { this.Dispatcher.BeginInvoke(delegateTest, i); //创建Dispatcher,使用BeginInvoke方法进行委托 Thread.Sleep(1000); //睡眠1秒 } } } } |