C# 线程问题

一、带参数的多线程调用

#region 执行带一个参数的多线程

            Thread mythread = new Thread(new ParameterizedThreadStart(Calculate));

            mythread.IsBackground = true;      

            mythread.Start(500);

            #endregion

        private void Calculate(object Max)              //带一个参数的委托函数 

        {

            int max = (int)Max;

            Stopwatch stopwatch = Stopwatch.StartNew();

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

            {

                Thread.Sleep(5);

            }

            stopwatch.Stop();

            long lSearchTime = stopwatch.ElapsedMilliseconds;

            MessageBox.Show(lSearchTime.ToString() + "毫秒");

        }
View Code

方式一: 定义一个类,将要传的参数设置为类的属性,然后将参数值赋值给类的属性,将类作为一个参数进行传达,以下代码通过两个参数示例,多个参数一样,代码如下:

class MyClass

    {

        public int Max { get; set; }

        public int Min { get; set; }

    }

            #region 第一种方式:执行带多个参数的多线程

            MyClass model = new MyClass();

            model.Max = 500;

            model.Min = 0;

            Thread mythread1 = new Thread(new ParameterizedThreadStart(CalculateTwo));

            mythread1.IsBackground = true;      

            mythread1.Start(model);

            #endregion

        private void CalculateTwo(object Myclass)              //带多个参数的委托函数 

        {

            MyClass model = (MyClass)Myclass;

            Stopwatch stopwatch = Stopwatch.StartNew();

            for (int i = model.Min; i < model.Max; i++)

            {

                Thread.Sleep(5);

            }

            stopwatch.Stop();

            long lSearchTime = stopwatch.ElapsedMilliseconds;

            MessageBox.Show(lSearchTime.ToString() + "毫秒");

        }
View Code

方式二:lambda表达式的方式,简单方便,

代码如下:

#region 第二种方式:执行带多个参数的多线程

            Thread mythread2 = new Thread(() => CalculateThree(500, 0));

            mythread2.IsBackground = true;        //設置為後臺線程,程式關閉后進程也關閉,如果不設置true,則程式關閉,此線程還在內存,不會關閉

            mythread2.Start();

            #endregion

        private void CalculateThree(int Max,int Min)              //带多个参数的委托函数 

        {

            Stopwatch stopwatch = Stopwatch.StartNew();

            for (int i = Min; i < Max; i++)

            {

                Thread.Sleep(5);

            }

            stopwatch.Stop();

            long lSearchTime = stopwatch.ElapsedMilliseconds;

            MessageBox.Show(lSearchTime.ToString() + "毫秒");

        }
View Code

二、静态变量和静态方法的线程安全问题

  静态方法内部创建的局部参数是线程安全的,不同线程调用同一个静态方法时,他们不会共享静态方法内部创建的参数,代码举例如下

public static void Test()
{
    int i = 0;
    Console.WriteLine(i);
    i++;
}

上面代码中,变量i在不同线程间是不会共享的,不同线程分别调用该方法,输出都是1,。

静态变量在不同线程间是共享的,这个相信大家都知道,而当静态方法中对静态变量进行操作时,这就涉及到了线程安全问题:

private static int i = 0;
public static void Test()
{
    Console.WriteLine(i);
    i++;
}

这段代码在由不同线程进行操作时,存在线程安全问题,所以应该加锁

private static int i = 0;
public static void Test()
{
    lock(this)
    {   
        Console.WriteLine(i);
        i++;
    }
}

猜你喜欢

转载自www.cnblogs.com/peterYong/p/10886441.html