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 的程式碼分組成不同的函數。
例如,可以有一個函數專門處理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;
}
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);
}
}
C# 中有許多內建的委派類型,用於表示不同類型的方法
以下是一些常見的委派類型:
Action
: 表示不返回任何值的方法。可以帶有零到多個參數。Func
: 表示返回值的方法。最後一個類型參數表示返回值的類型,前面的參數表示方法的參數。Predicate
: 表示返回布林值的方法,通常用於進行條件判斷。EventHandler
: 用於處理事件的方法,接受兩個參數,第一個是事件的發送者,第二個是事件的參數。Comparison
: 用於比較兩個對象的方法,返回一個表示比較結果的整數值。除了這些內建的委派類型,你還可以自定義自己的委派類型,以滿足特定的需求。委派類型可以提高代碼的可讀性和靈活性,並促進代碼的重用性和模塊化設計。