2014-9-3 线程

本文详细介绍了在C#中使用线程和委托的原理与实践,包括线程创建、多线程同步、参数传递及更新UI操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天复习一下线程.

一、委托

</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();
        }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值