C#之线程

今天给大家分享关于C#的几种调用的方法。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace _006线程池
{
    class Program
    {
        static void Main(string[] args)
        {
            // Thread t1 = new Thread(ThreadMain) { IsBackground = false };//为true的时候就需要结束该线程,不管你是否结束,false的时候是一个前台线程,他会等你结束后在结束
            //  t1.Abort();//终止线程,抛出异常
            // t1.Start();
            // t1.Join();//阻止线程运行,知道实例线程结束

            //Console.WriteLine("Thread +" + Thread.CurrentThread.ManagedThreadId + " started");
            //Console.WriteLine("Main thread ending now.");
            ThreadPool.QueueUserWorkItem(ThreadMain);//线程池预留空线程等待发配任务,而发配任务的时候,随机给完成任务的线程重新发配任务
            ThreadPool.QueueUserWorkItem(ThreadMain);
            ThreadPool.QueueUserWorkItem(ThreadMain);
            ThreadPool.QueueUserWorkItem(ThreadMain);
            ThreadPool.QueueUserWorkItem(ThreadMain);
            ThreadPool.QueueUserWorkItem(ThreadMain);
            ThreadPool.QueueUserWorkItem(ThreadMain);
            ThreadPool.QueueUserWorkItem(ThreadMain);
            ThreadPool.QueueUserWorkItem(ThreadMain);
            ThreadPool.QueueUserWorkItem(ThreadMain);
            Console.ReadKey();


        }
       
        static void ThreadMain(object state)
        {
            Console.WriteLine("Thread +" + Thread.CurrentThread.ManagedThreadId + " started");

            Thread.Sleep(1000);
           
        }     }
}

--------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace _007线程_任务开启
{
    class Program
    {
        static void Main(string[] args)
        {

            //第一种方式
            //Task t = new Task(ThreadMain);//传递一个线程执行一个方法
            //t.Start();//用任务开启一个线程

            //第二种方式开启的方式
            TaskFactory task = new TaskFactory();
            Task t=  task.StartNew(ThreadMain);

            Console.ReadKey();
        }
        static void ThreadMain()
        {
            Console.WriteLine("Thread +" + Thread.CurrentThread.ManagedThreadId + " started");

            Thread.Sleep(1000);

        }
    }
}
--------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace _004线程_委托发起的线程
{
    class Program
    {
        static void Main(string[] args)//开启一个线程,从上到下的执行这些内容,其实就是一个进程
        {
            //第一种开启线程的方式
            //Func<int,string,int> a = Text;
            ////a.BeginInvoke(15,"萌萌",null,null);//开启一个线程,执行a所引用的方法,需要一些时间去操作,他的线程与main的线程是异步操作
            //IAsyncResult ar= a.BeginInvoke(15, "萌萌", null, null);//他的返回值是当前异步线程的状态,return 的返回值是在线程结束时返回的
            //while (ar.IsCompleted==false)
            //{
            //    Thread.Sleep(10);
            //    Console.WriteLine("*");
            //}
            //int res = a.EndInvoke(ar);//在线程结束时拿到返回值100
            //Console.WriteLine(res);
            //Console.WriteLine("main");
            //Console.ReadKey();//运行新的线程的时候必须结束暂停

            //第二种开启线程的方式
            //Func<int, string, int> a = Text;
            //IAsyncResult ar = a.BeginInvoke(15, "萌萌", null, null);//判断线程运行的状态
            //bool IsEnd=  ar.AsyncWaitHandle.WaitOne(1000);//等待线程结束时间间隔
            //if (IsEnd)
            //{
            //    int res = a.EndInvoke(ar);
            //    Console.WriteLine(res);
            //}

            //第三种发起线程的方式
            Func<int, string, int> a = Text;
            /* IAsyncResult ar=  a.BeginInvoke(15, "萌萌", BackOut, a);/*///倒数第二个参数是回调函数,倒数第一个参数是委托对象(BackOut回调函数是在线程结束时调用)
            a.BeginInvoke(15, "萌萌", ar =>//用lambad表达式去检测结束一个线程
            {
                int res = a.EndInvoke(ar);
                Console.WriteLine(res);
            }, a);
            Console.ReadKey();





        }
        static void BackOut(IAsyncResult ar)//传递线程状态
        {
            Func<int, string, int> a = ar.AsyncState as Func<int, string, int>;
            int res = a.EndInvoke(ar);
            Console.WriteLine(res);

        }
        static int Text(int id, string name)
        {
            Console.WriteLine("测试线程" + id + name);
            Thread.Sleep(200);//单位为ms,线程睡眠0.2s
            return 100;
        }
    }
}

  

posted @ 2018-01-16 17:01  薛小爽  阅读(168)  评论(0编辑  收藏  举报