多线程系列一

同步方法和异步方法的区别

同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果
异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作

Action基本调用

Action是一种委托类型

Invoke直接在当前线程上调用目标方法

    class Program
    {
        static void Main(string[] args)
        {
            Action<string> action = DoSomething;
            action.Invoke("小明");
        }
        private static void DoSomething(string name)
        {
            Console.WriteLine($"{name}做事情");
        }
    }

 BeginInvoke和EndInvoke基本调用

BeginInvoke 方法启动异步调用 ,该方法具有与你要异步执行的方法相同的参数,另加两个可选参数。 

第一个参数是一个 AsyncCallback 委托,此委托引用在异步调用完成时要调用的方法。

第二个参数是一个用户定义的对象,该对象将信息传递到回调方法。

BeginInvoke 将立即返回,而不会等待异步调用完成。 

BeginInvoke 返回可用于监视异步调用的进度的 IAsyncResult

EndInvoke 可能会阻止调用线程,因为该方法直到异步调用完成后才返回

 

    class Program
    {
        static void Main(string[] args)
        {
            Action<string> action = DoSomething;
            // 对异步调用操作的描述
            IAsyncResult asyncResult = null;
            AsyncCallback asyncCallback = ar =>
            {
                Console.WriteLine($"{object.ReferenceEquals(ar, asyncResult)}");
                Console.WriteLine(ar.AsyncState);
            };
            asyncResult = action.BeginInvoke("太阳", asyncCallback, "月亮");
            asyncResult.AsyncWaitHandle.WaitOne();//直接等待任务完成
            action.EndInvoke(asyncResult);
        Console.ReadLine(); }
private static void DoSomething(string name) { Console.WriteLine($"{name}做事情"); } }

 

ThreadStart无参数

        static void Main(string[] args)
        {
            ThreadStart threadStart = new ThreadStart(DoNothing);
            Thread thread = new Thread(threadStart);
            thread.Start();
        }

        private static void DoNothing()
        {
            Console.WriteLine("无参数");
        }

ParameterizedThreadStart有参数

        static void Main(string[] args)
        {
            ParameterizedThreadStart threadStart = o=> DoSomething("有参数");
            Thread thread = new Thread(threadStart);
            thread.Start("有参数");
        }
        private static void DoSomething(string name)
        {
            Console.WriteLine($"{name}做事情");
        }

Task

    class Program
    {
        static void Main(string[] args)
        {
            Task task = new Task(()=>DoSomething("小明"));
            task.Start();
            Console.ReadLine();
        }
        private static void DoSomething(string name)
        {
            Console.WriteLine($"{name}做事情");
        }
    }

TaskFactory

    class Program
    {
        static void Main(string[] args)
        {
            TaskFactory taskFactory = Task.Factory;
            Task task = taskFactory.StartNew(()=>DoSomething("小明"));
            Console.ReadLine();
        }
        private static void DoSomething(string name)
        {
            Console.WriteLine($"{name}做事情");
        }
    }

Parallel

    class Program
    {
        static void Main(string[] args)
        {
            Parallel.Invoke(() => DoSomething("小明"),
                () => DoSomething("小芳"),
                () => DoSomething("小李")
                );
            Console.ReadLine();
        }
        private static void DoSomething(string name)
        {
            Console.WriteLine($"{name}做事情");
        }
    }

 

posted @ 2014-03-27 20:18  bradleydan  阅读(148)  评论(0)    收藏  举报