C# 多执行绪 配合委派 刷新UI

C# 多执行绪 配合委派 刷新UI

理解如下

1 增加一个额外的执行绪 让部分程式码在这个执行绪 上跑
2 这额外的执行绪 跑的内容如果有关UI刷新
就做一个函数来刷新UI + 一个委派 让委派跑函数刷新UI


第一种写法 纯粹写 不偷加 其他技巧

private void btn_start_Click(object sender, EventArgs e){    thr = new Thread(ShowMessage);//里面有个迴圈  在背景执行绪跑    thr.Start();}private delegate void delegate1(int sMessage);//宣告一个委派int i = 0;private void ShowMessage() //这个函数 在另外的执行绪上跑{    delegate1 dd1 = new delegate1(refreshUI);//生成一个委派    while (true)    {        this.Invoke(dd1, i);        Thread.Sleep(1000);        i++;    }}private void refreshUI(int numm){    textBox2.Text = numm.ToString();}private void btn_stop_Click(object sender, EventArgs e){    thr.Abort();}

但是

如果背景的执行绪 有很多部位 需要刷新UI
那就要做很多 刷新UI的函数出来

每个不同时间段 刷新的UI

不同的宣告委派再来 new委派还需对映 不同的函数刷新UI

多执行绪 委派到主执行绪 多部位刷新UI 如何写.....

我问chatGPT的

以下是一些可能的方法,可以帮助组织和管理刷新 UI 的程式码:

区分不同的刷新类型:
根据不同的刷新类型,可以将相关的刷新 UI 的程式码分组成不同的函数。
例如,可以有一个函数专门处理TextBox的刷新,另一个函数专门处理label的刷新

不同的刷新类型 那就需要宣告 各种的委派

根据不同的刷新类型将刷新 UI 的程式码分组成不同的函数
可以使用委派(Delegate)来达到这个目的
委派可以用来封装一个特定类型的方法,并允许将方法作为参数传递、存储和调用。

例如

假设你有一个委派类型 TextBox_Delegatelabel_Delegate
分别用于处理文本框和进度条的刷新。你可以定义这些委派如下:

//宣告 各种可能要用的委派   public delegate void TextBox_Delegate(string text);public delegate void label_Delegate(Color color);//然后,你可以定义对应的刷新函数,并将它们分配给相应的委派:// 分配刷新函数给委派   下面 两种写法都行TextBox_Delegate Delegate1 = new TextBox_Delegate(Update_TextBox);label_Delegate Delegate2 = Update_label;public void Update_TextBox(string text){    txt_note.Text=text;}public void Update_label(Color color){    label_5.BackColor = color;}

第二种写法 new委派时 有新的写法 更直觉

TextBox_Delegate Delegate1 = new TextBox_Delegate(Update_TextBox);label_Delegate Delegate2 = Update_label; //第二种写法

第三种 使用了 匿名

private void button1_Click(object sender, EventArgs e){    Thread thr = new Thread(realtime_RSSI);    thr.Start();}private void realtime_RSSI(){    while (true)    {        string readStr = "A1F1A2F2A3F3A4F4A5F5A6F6A7F7A8F8";        List<string> cut8 = new List<string>();        for (int i = 0; i < 8; i++)        {            cut8.Add(readStr.Substring(i * 4, 4));        }        //不用写 宣告委派   用C#内建现成的        //不用写 刷新函数  要怎样刷新 直接写在后面 直接用        Action<List<string>> dgv_Update_Delegate3 = delegate (List<string> read_Hex)        {            for (int i = 0; i < 8; i++)            {                string revert_str = read_Hex[i].Substring(2, 2) + read_Hex[i].Substring(0, 2);                double mV = (float)Convert.ToInt32(revert_str, 16) * 2500 / 4096;                double uA = mV / 2.4 * 4;                dgv_Rx_RSSI.Rows[i].Cells[1].Value = mV.ToString("0.00");                dgv_Rx_RSSI.Rows[i].Cells[2].Value = uA.ToString("0.00");            }        };        this.Invoke(dgv_Update_Delegate3, cut8);        Thread.Sleep(1000);    }}

Action 是一个 C# 原生 现成 委派 (delegate)

这种东西有很多吗

C# 中有许多内建的委派类型,用于表示不同类型的方法
以下是一些常见的委派类型:

Action: 表示不返回任何值的方法。可以带有零到多个参数。Func: 表示返回值的方法。最后一个类型参数表示返回值的类型,前面的参数表示方法的参数。Predicate: 表示返回布林值的方法,通常用于进行条件判断。EventHandler: 用于处理事件的方法,接受两个参数,第一个是事件的发送者,第二个是事件的参数。Comparison: 用于比较两个对象的方法,返回一个表示比较结果的整数值。

除了这些内建的委派类型,你还可以自定义自己的委派类型,以满足特定的需求。委派类型可以提高代码的可读性和灵活性,并促进代码的重用性和模块化设计。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章