分享

C# 多线程参数的使用

 时间剧毒 2019-05-06

一个参数:

Thread.Start方法可以带一个参数:

复制代码

public static void Main()  
{   Thread t
= new Thread(new ParameterizedThreadStart(B));   t.Start("B");   Console.Read(); } private static void B(object obj) {   Console.WriteLine("Method {0}!",obj.ToString ()); }

复制代码

多个参数:

1、将线程执行过程封装成一个类,将使用到的参数设置为类的变量或属性。使用时,将先声明并实体化一个执行类,并将其属性赋值,然后再创建线程调用其执行方法。

复制代码

public static void Main()  
{   My m
= new My();   m.x = 2;   m.y = 3;   Thread t = new Thread(new ThreadStart(m.C));   t.Start();   Console.Read(); } class My {   public int x, y;   public void C()   {     Console.WriteLine("x={0},y={1}", this.x, this.y);   } }

复制代码

2、使用委托

复制代码

private static void Main()
{
  Thread thread = new Thread(new ThreadStart(delegate{ Flash(a,b); }));
  thread.IsBackground = true;
  thread.Start();
}
private static void Flash(int a,string b) {   Console.WrilteLine("a is {0},b is {1}",a,b); }

复制代码

        //线程 执行单线程

        #region 

        private void button1_Click(object sender, EventArgs e)

        {

            //ThreadStart ts = new ThreadStart(method);

            //Thread t = new Thread(ts);

            Thread t = new Thread(method);

            //线程默认是前台线程,一个进程退出标志 所有的前台线程都结束之后,

            t.IsBackground = true;

            //线程的优先级 后台进程不会阻止 进程的推出

            t.Priority = ThreadPriority.Highest;  

            t.Start();

        }

        int  memo;

        public void method()

        {

            DateTime beginTime = DateTime.Now;

            for (int i = 0; i <= 50; i++)

            {

                memo += i;

                Thread.Sleep(1000);

            }

            TimeSpan ts = DateTime.Now.Subtract(beginTime);

            MessageBox.Show("执行完毕!!" + ts.TotalMilliseconds);

        }

        #endregion

        //Invoke()的作用是:在应用程序的主线程上执行指定的委托。

        //1、Invoke会阻止当前主线程的运行;BeginInvoke不会阻止当前主线程的运行,而是等当前主线程做完事情之后再执行BeginInvoke中的代码内容。

        // 2、这2个方法都是由主线程运行的,并不是异步执行,如果代码耗时过长,同样会造成界面卡死

        #region

        private delegate void myIncreaseHandle(bool _b);  //申明一个委托

        private void btnStrat_Click(object sender, EventArgs e)

        {

            Thread t = new Thread(threadmethod);

            t.IsBackground = true;

            t.Priority = ThreadPriority.Highest;

            t.Start();

            string aa = "123";

        }

        private void threadmethod()

        {

            this.Invoke(new myIncreaseHandle(myEventIncreaseHandle), new object[] { false });

        }

        private void myEventIncreaseHandle(bool _b)

        {

           this.btnStrat.Enabled = _b;

        }

        #endregion

//双色球案例

        List<Label> lblist = new List<Label>();

        private  Thread threadStart;

        private bool isRuning = false;   //启动运行标识

        private void frmProgress_Load(object sender, EventArgs e)

        {

            for (int i = 0; i < 6; i++) {

                Label lb = new Label();

                lb.Text = "0";

                lb.BackColor = Color.Transparent;

                lb.AutoSize = true;

                lb.Location = new Point(50*i+50,100);

                this.Controls.Add(lb);

                lblist.Add(lb);

            }

        }

        private void button3_Click(object sender, EventArgs e)

        {

            isRuning = true;

            Thread thread1 = new Thread(threadMethod);

            thread1.IsBackground = true;

            thread1.Start();

            threadStart = thread1;

        }

        private delegate void myIncreaseHandle(Label  lab ,string e);  //申明一个委托

        private void threadMethod()

        {

            Random r = new Random();

            while (isRuning)

            {

                foreach (Label item in lblist)

                {

                    string str=r.Next(0, 10).ToString();

                    if (item.InvokeRequired)

                    {

                        item.Invoke(new myIncreaseHandle(myEventIncreaseHandle), new object[] { item,str });

                    }

                    else

                    {

                        item.Text = str;

                    }

                }

                Thread.Sleep(100);

            }

        }

        private void myEventIncreaseHandle(Label  lab ,string e)

        {

            lab.Text  = e;

        }

        private void btnStop_Click(object sender, EventArgs e)

        {

            isRuning = false;

        }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多