今天复习一下线程.
一、委托
</pre><p><span style="font-size:18px;"></span></p><p><span style="font-size:18px;"><span style="white-space:pre"> delegate void DGCount();</span></span></p><p><span style="font-size:18px;color:#ff0000;">PS:委托也是一个类</span></p><p></p><p>二、多线程</p><p><span style="white-space:pre"> </span><strong>1、首先定了一个计数方法</strong></p><p><span style="white-space:pre"> </span><pre name="code" class="csharp">//方法1
void CountSum()
{
int sum = 0;
DateTime beginTime = DateTime.Now;
for (int i = 0; i < 999990000; i++)
{
sum += i;
//txtSum.Text = sum.ToString();
}
TimeSpan ts = -(beginTime.Subtract(DateTime.Now));
MessageBox.Show("循环完毕!!" + sum.ToString()+","+ts.TotalMilliseconds);
}
//方法2:
void sayHello()
{
for (int i = 0; i < 999990000; i++)
{
//txtSum.Text = sum.ToString();
}
MessageBox.Show("nohao");
}
2、Thread 实例化
<span style="white-space:pre"> </span> Thread countThread = new Thread(CountSum);
countThread.Name = "1";
countThread.Start();
Thread countSecond = new Thread(sayHello);
countSecond.Name = "2";
countSecond.Start();
3、前台、后台线程
PS:默认是一前台线程。
前台线程:把应用程序所有的前台线程关闭,才能完成程序的关闭。
后台线程:只要所有的前台线程结束,后台线程自动结束。
以下是设置为后台线程。
Thread countThread = new Thread(CountSum);
//结程名
countThread.Name = "1";
//设置为后台线程
countThread.IsBackground = true;
//线程启动
countThread.Start();
4 线程传递参数
这是一个参数
//还是就是参数类型一定要object
void showTxtName(object name)
{
MessageBox.Show("name=" + name);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string name = txtName.Text;
Thread showName = new Thread(showTxtName);
showName.Name = "showName";
showName.IsBackground = true;
<span style="white-space:pre"> </span> //在start中传递参数
showName.Start(name);
}
这是带多个参数
void showTxtName(string name,int age)
{
MessageBox.Show("name=" + name + ",age=" + age.ToString());
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string name = txtName.Text;
string age = txtAge.Text;
//用匿名委托传递多个参数
Thread showName = new Thread(delegate()
{
showTxtName("wjp", 25);
});
showName.Name = "showName";
showName.IsBackground = true;
showName.Start();
}
用委托更新UI
//一个更新UI的委托
private delegate void DGUI(int sum);
private DGUI dgui;
//更新UI方法
void UpdateUI(int sum)
{
txtSum.Text = sum.ToString();
}
//线程执行方法
void CountSum(int startNum)
{
int sum = 0;
for (int i = startNum; i < 1000; i++)
{
sum += i;
//创建Dispatcher,使用BeginInvoke方法进行委托
<span style="white-space:pre"> </span>//wpf
this.Dispatcher.BeginInvoke(dgui, sum);
<span style="white-space:pre"> </span>//winForm
<span style="white-space:pre"> </span>////this.Invoke(dgui,sum);
//睡眠1秒 如果不设UI会卡住
Thread.Sleep(1);
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//实例化委托,就是添加委托要执行的方法,
//可以用+=添加多个方法,如下面再增加 dgui +=方法名;
//添加的方法,返回值和参数列表 必须与委托类型结构相同
//即这里dgui与UpdateUI参数都为int,返回值都为void
dgui = UpdateUI;
//用匿名委托传递参数
Thread t1 = new Thread(delegate()
{
CountSum(100);
});
t1.Start();
}