C# 并行编程指南之Thread

使用C# 原始的多线程技术,即Thread技术

使用Thread类首先要引入 System.Threading命名空间

Thread类有两个常用构造函数版本

1.Thread(ThreadStart start)

2.Thread(ParamterizedThreadStart start)

区别在于第一个构造版本只能接受 不带任何参数也不带任何返回值的方法

如:

void Method()
{
    //do things here
}

这样的方法。

第二个构造版本只能接受 带一个object型参数不带任何返回值的方法

void Method(object arg)
{
   //do things here
}

这样的方法,调用的时候 这样进行传参即可 t.Start("参数"),C# 会自动对对象进行装箱操作,在具体使用中需要对其进行拆箱操作,下面来看一个例子

public class ThreadTest
    {
        public void Invoke()
        {
            Console.WriteLine ("Main thread is running,thread Id is: {0}",Thread.CurrentThread.ManagedThreadId);

            Thread t = new Thread (new ThreadStart (Method));
            Thread t2 = new Thread (new ParameterizedThreadStart (Method2));
            t.Start ();
            t2.Start ("hello thread with paramter.");
            Thread.Sleep (1000);
            Console.WriteLine ("Main thread is ending.");
        }

        private void Method()
        {
            Console.WriteLine ("thread is running,thread Id is: {0}",Thread.CurrentThread.ManagedThreadId);
        }

        private void Method2(object arg)
        {
            Console.WriteLine ((string)arg);
            Console.WriteLine("thread is running,thread Id is: {0}",Thread.CurrentThread.ManagedThreadId);
        }
    }


调用它

class MainClass
    {
        public static void Main (string[] args)
        {
            ThreadTest test = new ThreadTest ();
            test.Invoke ();
            Console.ReadKey ();
        }
    }

会看到两个方法在不同线程中运行,此处Thread.Sleep(1000) 是线程类提供的静态方法,可以让线程暂停1000毫秒。

那么如果需要线程方法有返回值,又该怎么办呢?别急,有办法的,这时候我们只需要一个辅助包装类

public class Wrap
    {
        public string Result{ get; set; }
        public void WrapMethod(object arg)
        {
            Console.WriteLine("thread is running,thread Id is: {0}",Thread.CurrentThread.ManagedThreadId);
            string s = (string)arg;
            s = s.ToLower ();
            Result = s;
        }
    }
Wrap wrap = new Wrap();
Thread t3 = new Thread (new ParameterizedThreadStart (wrap.WrapMethod));
t3.Start("Hello Thread With Arg.");

然后通过wrap的Result属性取回结果即可。

posted @ 2014-02-11 14:40  王晓阳  阅读(413)  评论(0编辑  收藏  举报