• C#开启线程的四种方式


    1.异步委托开启线程

    复制代码
        public class Program
        {
            public static void Main(string[] args)
            {
                Action<int, int> a = add;
                a.BeginInvoke(3, 4, null, null);
                Console.WriteLine("执行线程");
                Console.ReadKey();
            }
            static void add(int a, int b)
            {
                Console.WriteLine(a + b);
            }
        }
    复制代码

    2.通过Thread类开启线程

    复制代码
        public class Program
        {
            public static void Main(string[] args)
            {
                Thread t1;
                Thread t2;
                t1 = new Thread(SetInfo1);
                t2 = new Thread(SetInfo2);
                t1.Start();
                //线程睡眠
                //t1.Join(1000);
                //挂起线程
                t1.Suspend();
                //继续执行线程
                t1.Resume();
                //结束线程
                //t1.Abort();
    
                t2.Start();
                Console.ReadKey();
            }
            //奇数线程
            public static void SetInfo1()
            {
                for (int i = 0; i < 100; i++)
                {
                    if (i % 2 != 0)
                    {
                        Console.WriteLine("奇数为" + i);
                    }
                }
            }
            //偶数线程
            public static void SetInfo2()
            {
                for (int i = 0; i < 100; i++)
                {
                    if (i % 2 == 0)
                    {
                        Console.WriteLine("偶数为" + i);
                    }
                }
            }
        }
    复制代码

    3.通过线程池开启线程

    复制代码
    //线程池可以看做容纳线程的容器;一个应用程序最多只能有一个线程池;ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池; 每排入一个工作函数,就相当于请求创建一个线程;
        //线程池的作用:
        //1、线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
        //2、如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且我们还不能控制线程池中线程的开始、挂起、和中止
        public class Program
        {
            public static void Main(string[] args)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(TestThreadPool), new string[] { "hjh" });
                Console.ReadKey();
            }
            public static void TestThreadPool(object state)
            {
                string[] arry = state as string[];//传过来的参数值
                int workerThreads = 0;
                int CompletionPortThreads = 0;
                ThreadPool.GetMaxThreads(out workerThreads, out CompletionPortThreads);
                Console.WriteLine(DateTime.Now.ToString() + "---" + arry[0] + "--workerThreads=" + workerThreads + "--CompletionPortThreads" + CompletionPortThreads);
            }
        }
    复制代码

    4.通过任务Task开启线程

    复制代码
    public class Program
        {
            public static void Main(string[] args)
            {
                Task task = new Task(DownLoadFile_My);
                task.Start();
                Console.ReadKey();
            }
            static void DownLoadFile_My()
            {
                Console.WriteLine("开始下载...线程ID:"+Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(500);
                Console.WriteLine("下载完成!");
            }
        }
    复制代码
  • 相关阅读:
    idea 管理java 多module的工程
    协程与函数线程异步的关系
    HDU 5640 King's Cake【模拟】
    逻辑运算
    Silverlight 学习笔记——布局 Evil 域 博客园
    ExtJS 日期格式问题
    偏方收藏(此信息为本人收藏,安全性无法验证,使用后产生的一些后果自负)
    form和column:extJS的布局
    Sqlserver 通用存储过程分页
    Ext中TreePanel控件和TabPanel控件搭配测试
  • 原文地址:https://www.cnblogs.com/zxdz/p/13686391.html
Copyright © 2020-2023  润新知