本人最近需要操作多線程,但是在C#中有一個問題,線程中操作主線程中的控件就會提示錯誤,或者操作有問題,為此可以使用委托代理的方法,以下是本人借鑒網上的內容自己編寫的例子:(在解說之後附帶程序代碼)
上圖為軟件控件界面,ListView控件中在Columns可以添加列信息,但是為了得到上面的效果,需要將ListView控件中的View屬相設置成Details。
使用多線程需要引用System.Threading。
此外,為了在不同的方法之間傳遞數據信息,可以設置全局變量:
public Thread thread = null;
public int iNo = 0;
public string strNo = null;
樓主發現,如果項目中包含多個界面,在界面之間傳遞數據的最好辦法是添加類,在類中申請變量,本項目添加一個類CCValue,並在CCValue中定義變量
public static bool thStop = false;//申請bool型變量控制線程啟停
開啟按鈕代碼:
private void button1_Click(object sender, EventArgs e)
{
thread = new Thread(new ThreadStart(Dowork));
thread.Start();
}
退出按鈕代碼:(本按鈕只是退出線程,並不是退出窗口)
private void button3_Click(object sender, EventArgs e)
{
CCValue.thStop = true;
thread.Join(1);
}
Hello按鈕代碼:(本按鈕主要是為了測試是否真正的實現了多線程)
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello");
}
多線程操作代碼:
public delegate void MyInvoke(string str1, string str2);
public void Dowork()
{
while (!CCValue.thStop)
{
if (CCValue.thStop)
{
break;
}
else
{
strNo = iNo.ToString().Trim();
MyInvoke mi = new MyInvoke(UpdateForm);
this.BeginInvoke(mi, new object[] { "我是文本框", strNo });//注意此處的new object[] { "我是文本框", strNo }與下面的
//UpdateForm(string param1,string param2)是變量對應的,
//也即是向方法UpdateForm(string param1,string param2)
//傳送數據
Thread.Sleep(1000);
iNo++;
}
}
}
public void UpdateForm(string param1,string param2)
{
this.textBox1.Text = param1 + param2;
ListViewItem item = new ListViewItem(param1);
item.SubItems.Add(param2);
listView1.Items.Add(item);
}
以上操作結束以後大家一下就會已經實現了多線程。