在寫winform程序時(shí)候,如果時(shí)間長(zhǎng)的操作不用線程操作。那么會(huì)卡死UI,點(diǎn)擊界面就體現(xiàn)為未響應(yīng)。為此需要對(duì)耗時(shí)操作用線程處理,比如檢驗(yàn)的監(jiān)聽程序就是一個(gè)死循環(huán),不停檢查文件夾或數(shù)據(jù)庫(kù)又沒有數(shù)據(jù),然后上傳。如果不時(shí)有線程,在數(shù)據(jù)多的情況,程序是基本點(diǎn)不動(dòng)的,這樣體驗(yàn)就很不好。
1.首先拖個(gè)文本框準(zhǔn)備用線程給里面寫文本
2.測(cè)試代碼,創(chuàng)建一個(gè)線程,直接操作UI控件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace ThreadUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 加載方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
//用線程寫文本
Thread t = new Thread(WriteTxt);
t.Start();
}
/// <summary>
/// 寫文本
/// </summary>
public void WriteTxt()
{
for(int i=0;i<100;i++)
{
richTextBox1.Text += "第" + i + "行\(zhòng)n";
}
}
}
}
3.運(yùn)行報(bào)錯(cuò),這里報(bào)錯(cuò)不能從線程訪問UI控件
那么對(duì)于線程運(yùn)行長(zhǎng)時(shí)間操作,想和UI交互怎么辦呢?
這里需要用委托解決線程和UI交互:
1.先定義一個(gè)委托
2.把操作UI的方法再用委托包一層
3.線程調(diào)用包裝的方法
調(diào)整代碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace ThreadUI
{
/// <summary>
/// 寫日志委托
/// </summary>
/// <param name="info"></param>
public delegate void WriteInfoDelegate(string info);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 加載方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
//用線程寫文本
Thread t = new Thread(WriteTxt);
t.Start();
}
/// <summary>
/// 寫日志代理方法
/// </summary>
/// <param name="info"></param>
public void WriteInfoProxy(string info)
{
//組裝參數(shù)
object[] paras = new object[] { info };
//在UI線程執(zhí)行委托
this.Invoke(new WriteInfoDelegate(SetTxt), paras);
}
/// <summary>
/// 操作控件邏輯
/// </summary>
/// <param name="info"></param>
public void SetTxt(string info)
{
richTextBox1.Text += info;
}
/// <summary>
/// 寫文本
/// </summary>
public void WriteTxt()
{
for(int i=0;i<100;i++)
{
WriteInfoProxy("第" + i + "行\(zhòng)n");
}
}
}
}
就不會(huì)異常了
C#的委托我理解為函數(shù)指針,和C及C++里的指針不同的是他類型化更明顯了。什么類型的委托可以初始化什么類型的方法委托變量。這樣就可以把函數(shù)指針到處傳遞了。在子彈窗觸發(fā)父窗體刷新等也基于委托調(diào)用也是一個(gè)很好的方式。千萬別到父頁面搞個(gè)靜態(tài)方法這種方式給子頁面調(diào)額。這種太死了,借助委托可以把方法層層傳遞給任何要調(diào)用的地方。文章來源:http://www.zghlxwxcb.cn/news/detail-537040.html
iMedicalLIS監(jiān)聽程序的基礎(chǔ)就基于線程和委托來實(shí)現(xiàn)異步,防止卡UI。文章來源地址http://www.zghlxwxcb.cn/news/detail-537040.html
到了這里,關(guān)于C#線程操作UI控件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!