2.利用委托调用--最常见的办法(仅WinForm有效) 
  

using System; 
using System.Threading; 
using System.Windows.Forms; 

namespace ThreadTest 

    public partial class Form1 : Form 
    { 
        delegate void D(object obj); 

        public Form1() 
        { 
            InitializeComponent();             
        } 
        

        private void btnSet_Click(object sender, EventArgs e) 
        {            
            Thread t = new Thread(new ParameterizedThreadStart(SetTextBoxValue)); 
            t.Start("Hello World"); 
        } 

        void SetTextBoxValue(object obj)  
        { 
            if (textBox1.InvokeRequired) 
            { 
                D d = new D(); 
                textBox1.Invoke(d,obj); 

            } 
            else  
            { 
                this.textBox1.Text = obj.ToString(); 
            } 
        } 

        void DelegateSetValue(object obj)  
        { 
            this.textBox1.Text = obj.ToString(); 
        } 
    } 

3.利用SynchronizationContext上下文 -- 最神秘的方法(Winform/Silverlight能用) 

之所以说它神秘,是因为msdn官方对它的解释据说也是不清不楚  
  

using System; 
using System.Threading; 
using System.Windows.Forms; 

namespace ThreadTest 

    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent();             
        }        

        private void btnSet_Click(object sender, EventArgs e) 
        { 
            Thread t = new Thread(new ParameterizedThreadStart(Run)); 
            MyPram _p = new MyPram() { context = SynchronizationContext.Current, parm = "Hello World" }; 
            t.Start(_p); 
        } 

        void Run(object obj)  
        { 
            MyPram p = obj as MyPram; 
            p.context.Post(SetTextValue, p.parm); 
        } 

        void SetTextValue(object obj)  
        { 
            this.textBox1.Text = obj.ToString(); 
        } 
    } 

    public class MyPram  
    { 
        public SynchronizationContext context { set; get; } 
        public object parm { set; get; } 
    } 

4.利用BackgroundWorker --最偷懒的办法(Winform/Silverlight通用) 

BackgroundWorker会在主线程之外,另开一个后台线程,我们可以把一些处理放在后台线程中处理,完成之后,后台线程会把结果传递给主线程,同时结束自己。 

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace ThreadTest 

    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent();             
        }        

        private void btnSet_Click(object sender, EventArgs e) 
        { 
            //MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString()); 
            using (BackgroundWorker bw = new BackgroundWorker()) 
            { 
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
                bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
                bw.RunWorkerAsync("Hello World"); 
            } 
        } 

        void bw_DoWork(object sender, DoWorkEventArgs e) 
        { 
            //MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString()); 
            e.Result = e.Argument;//这里只是简单的把参数当做结果返回,当然您也可以在这里做复杂的处理后,再返回自己想要的结果(这里的操作是在另一个线程上完成的) 
        } 

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
        { 
            //这时后台线程已经完成,并返回了主线程,所以可以直接使用UI控件了 
            this.textBox1.Text = e.Result.ToString(); 
            //MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString()); 
        }        
    }     
}

C# 多线程刷新UI的更多相关文章

  1. 拒绝卡顿——在WPF中使用多线程更新UI

    原文:拒绝卡顿--在WPF中使用多线程更新UI 有经验的程序员们都知道:不能在UI线程上进行耗时操作,那样会造成界面卡顿,如下就是一个简单的示例: public partial class MainW ...

  2. Android -- ViewRoot,关于子线程刷新UI

    Android在4.0之后执行线程更新UI操作会报异常:CalledFromWrongThreadException:Only the original thread that created a v ...

  3. 开子线程下载图片,回到主线程刷新UI步骤

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [NSThread detachN ...

  4. iOS-主线程刷新UI【+单例】

    主线程刷新UI dispatch_async(dispatch_get_main_queue(), ^{ /// }); 单例 static Tools *_sharedManger; @implem ...

  5. Android开发——fragment中数据传递与刷新UI(更改控件)

    数据传递: 1.通过数据库进行数据的传递 如在fragment中将数据保存在数据库中,之后其他的fragment或者activity直接读取数据库中的数据,数据库使用还算简单,这里就不多说,建议使用l ...

  6. 关于iOS刷新UI需要在主线程执行

    为什么一定要在主线程刷新UI? 安全+效率:因为UIKit框架不是线程安全的框架,当在多个线程进行UI操作,有可能出现资源抢夺,导致问题. 其实:在子线程是不能更新UI的, 看到能更新的结果只是个假象 ...

  7. WPF里面多线程访问UI线程、主线程的控件

    如果出现以下错误:调用线程无法访问此对象,因为另一个线程拥有该对象. 你就碰到多线程访问UI线程.主线程的控件的问题了. 先占位.

  8. Android多线程更新UI的方式

    Android下,对于耗时的操作要放到子线程中,要不然会残生ANR,本次我们就来学习一下Android多线程更新UI的方式. 首先我们来认识一下anr: anr:application not rep ...

  9. WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口)

    原文 WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口) WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验.如果希望做不同线程 ...

随机推荐

  1. Docker以过时,看Containerd怎样一统天下

    Docker作为非常流行的容器技术,之前经常有文章说它被K8S弃用了,取而代之的是另一种容器技术containerd!其实containerd只是从Docker中分离出来的底层容器运行时,使用起来和D ...

  2. python使用笔记14--商品管理小练习

    1 import json 2 import pymysql 3 IP = '127.0.0.1' 4 PORT = 3306 5 USER_NAME = 'root' 6 PASSWORD = '1 ...

  3. ORB随便记一记

    论文摘取 (这部分看的是泡泡机器人的翻译) 基于特征点.单目.完全自动初始化,基于PTAM框架. 相关工作 A.位置识别(大概是用于回环检测) bags of words FAB-map DBOW2 ...

  4. GDB常用命令整理

    (gdb) break xxx (gdb) b xxx 在源代码指定的某一行设置断点,其中 xxx 用于指定具体打断点的位置. (gdb) run (gdb) r 执行被调试的程序,其会自动在第一个断 ...

  5. ArrayList 深入浅出

    ArrayList 特点:按添加顺序排列.可重复.非线程安全: 底层实现:数组 扩容原理:初始化集合时,默认容量为 0,第一次添加元素时扩容为 10,容量不够时扩容为原来容量的 1.5 倍. 这里扩容 ...

  6. React 组件间通信 总结

    组件间通信 5.1.1. 方式一: 通过props传递 1)         共同的数据放在父组件上, 特有的数据放在自己组件内部(state) 2)         通过props可以传递一般数据和 ...

  7. 微信小程序云开发-云存储的应用-识别通用印刷体

    一.准备工作 1.创建云函数identify 2.云函数identify中index.js代码 1 // 云函数入口文件 2 const cloud = require('wx-server-sdk' ...

  8. 第二十七篇 -- QTreeWidget总结

    前言 之前写过几篇关于TreeWidget的文章,不过不方便查阅,特此重新整合作为总结.不过关于QtDesigner画图,还是不重新写了,看 第一篇 就OK. 准备工作 1. 用QtDesigner画 ...

  9. 'utf-8' codec can't decode byte的解决办法

    参考链接:https://www.cnblogs.com/zyh19980816/p/11830065.html 问题:''utf-8' codec can't decode byte 0xa3 in ...

  10. 第四篇--Beyond Compare4 试用期30天后

    30天后删除BCUnrar.dll这个文件,继续使用30天.还有就是注册表中regedit-->HEKY_CURRENT_USER-->Software-->Scooter Soft ...