• 一个完整的操作UI线程的例子,用到了多种方式 遥远的青苹果


    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("完成 ");
    
            }
    
    
        }
    }
    
  • 相关阅读:
    GitHub 如何创建 Access Token
    Fact Table 数据表什么意思
    高基数数据特性是什么意思
    Edge 浏览器的隐藏 URL QR 生成器
    Apache Druid 安装的时候进行 Java 版本校验没有输出
    Apache Druid 简介
    如何在 Discourse 中批量移动主题到不同的分类中
    素材
    Drawable转bitmap
    Drawable与 Bitmap 转换总结
  • 原文地址:https://www.cnblogs.com/lixinhai/p/2541311.html
Copyright © 2020-2023  润新知