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_Delegate
和label_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
: 用于比较两个对象的方法,返回一个表示比较结果的整数值。除了这些内建的委派类型,你还可以自定义自己的委派类型,以满足特定的需求。委派类型可以提高代码的可读性和灵活性,并促进代码的重用性和模块化设计。