Linux C语言中的多线程参考这篇博客:https://www.cnblogs.com/Suzkfly/p/10388090.html

  简单提一下,Linux C中用pthread_create函数,指定线程资源、线程属性、线程函数,以及给函数传递的参数,在C#中也是如此。

  C#中用多线程需要引用:System.Threading;

  需要构造一个Thread对象,Thread对象的构造方式有4种,如下:

public Thread(ThreadStart start);
public Thread(ParameterizedThreadStart start);
public Thread(ThreadStart start, int maxStackSize);
public Thread(ParameterizedThreadStart start, int maxStackSize);

  第1种要传入一个ThreadStart类型的参数,ThreadStart的定义如下:

public delegate void ThreadStart();

  可见这是一个委托,类似于函数指针,而且没有参数,没有返回值,那么很显然,它其实就是线程的回调函数(方法)。

  第2种构造方式是传入了一个ParameterizedThreadStart类型的参数,它的定义如下:

public delegate void ParameterizedThreadStart(object obj);

  可见这是一个带有一个object类型的参数,无返回值的委托。

  参见C语言中注册线程的回调函数的类型为:void *(*start_routine) (void *),这是一个返回值类型为void*型,并且带有一个void*型的参数的函数指针,这样传入的参数就可以是任意类型的指针,如果不使用参数的话,直接传入NULL即可。但是在C#中,用object类型代替了C语言中的void*类型,并且对构造函数重载,将带参和不带参区分开来。

  第3和第4种构造方式是在前两种构造方式的基础上加入了一个int maxStackSize,用于指定该线程最大栈的大小。

  那么创建一个线程的方式就很简单了。先定义回调函数(方法):

static void test()
{
       Console.WriteLine("Hello");
}

  然后:

Thread thread = new Thread(test);

  或者:

Thread thread = new Thread(new ThreadStart(test));

  但是不像Linux C 中那样注册过后的线程自己会运行,在C#中需要调用thread.Start();线程才会运行。

  开启一个线程,然后和Main里各自打印线程ID的程序如下:

using System;
using System.Threading;

namespace Test
{

    class Test
    {
        static void test()
        {
            while (true)
            {
                Console.WriteLine("test Id = {0}", Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(2000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(test));
            thread.Start();

            while (true)
            {
                Console.WriteLine("Main Id = {0}", Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(2000);
            }
        }
    }
}

  执行结果:

 

   那么问题来了,如果传入的方法需要带参数该怎么办呢?这个时候看看thread.Start的声明:

public void Start(object parameter);
public void Start();

  这个方法是经过重载的,它也可以带一个参数,这个参数就是传入给回调函数的参数,测试程序如下:

using System;
using System.Threading;

namespace Test
{

    class Test
    {
        static void test(object arg)
        {
            Console.WriteLine("arg = {0}", arg);
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ParameterizedThreadStart(test));
            thread.Start(123);

            Console.ReadKey();
        }
    }
}