using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace CroessThread更新文本
{public partial class Form1 : Form{public Form1(){InitializeComponent();}delegate void invokeCallBackSetTextDelegent(string content); //代理 /// <summary>/// 多线程调用控件正确的方法/// </summary>/// <param name="content"></param>private void OperationControl(object content){string convertObjTocontent = content as string;if (this.txtMrid.InvokeRequired)//{invokeCallBackSetTextDelegent fc = new invokeCallBackSetTextDelegent(OperationControl); //this.Invoke(fc);//通过代理调用刷新方法}else{this.txtMrid.Text = this.txtMrid.Text + "," + convertObjTocontent;}}/// <summary>/// 多线程调用控件正确的方法/// </summary>/// <param name="content"></param>private void OperationControl(string content){string convertObjTocontent = content as string;if (this.txtMrid.InvokeRequired)//{invokeCallBackSetTextDelegent fc = new invokeCallBackSetTextDelegent(OperationControl); //this.Invoke(fc,content);//通过代理调用刷新方法}else{this.txtMrid.Text = this.txtMrid.Text + "," + convertObjTocontent;}}/// <summary>/// 多线程调用控件正确的方法/// </summary>/// <param name="content"></param>private bool OperationControlWithReturn(object content){string convertObjTocontent = content as string;if (this.txtMrid.InvokeRequired)//{invokeCallBackSetTextDelegent fc = new invokeCallBackSetTextDelegent(OperationControl); //this.Invoke(fc, content);//通过代理调用刷新方法}else{this.txtMrid.Text = this.txtMrid.Text + "," + convertObjTocontent;}return true;}/// <summary>/// 更新文本/// </summary>/// <param name="txtMrid"></param>/// <param name="txtName"></param>/// <param name="txtState"></param>private void SetTextSafe(string txtMrid, string txtName, string txtState){if (this.txtMrid.InvokeRequired){//方法一 缺陷 容易参数范围扩大提升或是减小this.txtMrid.Invoke(new MethodInvoker(delegate { this.txtMrid.Text = txtName; })); // 匿名委托 无参数, 不用创建不用定义委托类型和委托方法体//方法二 缺陷WaitCallback callBack = new WaitCallback(OperationControl); //用创建WaitCallback的 委托this.txtMrid.Invoke(callBack, new object[] { txtMrid }); // 主动型 //方法三 (缺陷的方法,注入到主线程 )//将代理绑定到方法 invokeCallBackSetTextDelegent fc = new invokeCallBackSetTextDelegent(OperationControl); // 同方法二,只不过是自定义需要自己创建不用定义委托类型this.Invoke(fc, new object[] { txtMrid });//调用代理//方法五 invokeCallBackSetTextDelegent synacall = new invokeCallBackSetTextDelegent(OperationControl); // 同方法二完全一样AsyncCallback callback = new AsyncCallback(SynacalCallBack);IAsyncResult result = synacall.BeginInvoke(txtMrid, callback, null);//异步版本的synacall.EndInvoke(result);//方法六 Action<string> actAnoi = delegate(string arg) { OperationControl(arg); }; //不用定义委托类型  actAnoi(txtMrid);//方法六 Action<string> actAname =new Action<string>(OperationControl); //不用定义委托类型  actAnoi(txtMrid);//方法七Func<string, bool> func = new Func<string, bool>(OperationControlWithReturn); //不用定义委托类型 func.Invoke(txtMrid);}else{this.txtMrid.Text = txtMrid;}}private void button1_Click(object sender, EventArgs e){List<string> lsstr = new List<string>();lsstr.Add("同志们");lsstr.Add("大家好");lsstr.Add("早上好");ParameterizedThreadStart delstart = new ParameterizedThreadStart(SetTextCommon);Thread thread = new Thread(delstart);thread.Start(lsstr);}private void SetTextCommon(object lsObje){List<string> lsstring = lsObje as List<string>;SetTextSafe(lsstring[0], string.Empty, string.Empty);}private void SynacalCallBack(IAsyncResult result){Console.WriteLine("完成 ");}}
}

转载于:https://www.cnblogs.com/lixinhai/archive/2012/06/08/2541311.html

一个完整的操作UI线程的例子,用到了多种方式相关推荐

  1. android操作ui线程

    runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, "网络 ...

  2. Android开发:操作UI线程4种方法

    我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据.但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的.下面总结4 ...

  3. android 异步回调中操作UI线程,UI同步、卡死阻塞等性能问题

    android开发中,回调无处不在,整个android开发的框架就是以回调机制建立起来的.如:activity,service,broadcast,fragment,view事件监听,baseadap ...

  4. Android异步机制一:使用Thread+Handler实现非UI线程更新UI界面

    概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程.而由于Andr ...

  5. Android在UI线程访问数据库,Android UI Operation in Thread

    Painless Threading (无痛苦使用线程) 本文讨论Android应用程序的线程模型以及应用程序应该如何创建工作线程而不是使用主线程来处理长期运行的操作, 以得到好的UI性能. 本文还解 ...

  6. andorid程序UI线程下开启子线程闪退错误解决

    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original 运行时报 android.view.ViewRo ...

  7. 理解UI线程——SWT, Android, 和Swing的UI机理

    2019独角兽企业重金招聘Python工程师标准>>> 在做GUI的时候, 无论是SWT, AWT, Swing 还是Android, 都需要面对UI线程的问题, UI线程往往会被单 ...

  8. android 组件 线程,Android UI线程和非UI线程

    UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的 ...

  9. Android UI线程和非UI线程

    UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的 ...

最新文章

  1. [转]进程,线程和多线程
  2. comboBox绑定数据库后SelectedIndexChanged事件出错
  3. java if 定义变量_java – 如何分配在if else语句中定义的变量
  4. jwt java 项目实例_JWT(JsonWebToken)+SpringMVC项目demo
  5. Android动态日志,一个简单的Android日志类
  6. 泛函编程(7)-数据结构-List-折叠算法
  7. Kubernetes 小白学习笔记(8)--kubernetes的基础概念
  8. PLINK-GWAS学习9------对于二元数据的关联分析
  9. html中pt与px的转换,关于网页中pt和px的单位换算!
  10. Webstorm配置less
  11. 十六进制计算机app,16进制计算器为16进制计算软件,能为用户提供多的方便
  12. JavaEE中的依赖性——依赖性注入
  13. 644 · 镜像数字
  14. python如何爬取实时人流量_使用python爬取微信宜出行人流量数据
  15. php获取搜索框的函数,PHP自定义函数获取搜索引擎来源关键字的方法
  16. 先学python还是ros_如何学习Ros?
  17. NTU RGB+D动作识别数据集
  18. Python实践 - 网络爬虫笔记 - 1、对 URL 的 get 请求
  19. Eclipse安装SVN插件及使用详细步骤
  20. [笔记]Unity粒子特效2:创建一个粒子特效

热门文章

  1. 转:python——IPy库
  2. 修改2k自动登陆的脚本
  3. 南邮CTF密码学write up
  4. [Microsoft][ODBC SQL Server Driver][SQl Server]参数数据类型 text 对于 replace 函数的参数 1 无效。...
  5. 使用WebBrowser与msHtml开发WinForms下的HtmlEditor控件
  6. java学习笔记(七)----异常
  7. nohup 输出日志到文件_超详细的EFK安装部署教程--filebeat日志数据采集
  8. 激光标记舱口轮廓生成_宣城国产圆管激光切割机-利晟激光
  9. 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )
  10. 【错误记录】Google Play 上架报错 ( 您的应用包含违反“元数据”政策的内容 | GP 政策中心 )