zoukankan      html  css  js  c++  java
  • c#之线程基础(一)

    可以认为线程是一个虚拟进程,用于独立运行一个特定的程序。

    1.使用c#创建线程

    using System;
    using System.Threading; //3
    
    namespace MutiThreadDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
    //5 Thread t
    = new Thread(PrintNumber); t.Start(); PrintNumber(); Console.ReadLine(); } //4 static void PrintNumber() { Console.WriteLine("Starting ..."); for(int i = 1;i< 10; i++) { Console.WriteLine(i); } } } }

    在上面的代码中,步骤4定义了方法 PrintNumber , 该方法会被主线程和新创建的线程使用。

    在我们构造一个线程时,ThreadStart 或 ParameterizedThreadStart 的实例委托会传给构造函数。

    我们只需指定在不同线程运行的方法名,而 c# 编译器则会在后台创建这些对象。

    运行结果:两组范围为1 -10的数字会随机交叉输出。这说明了PringNumber方法同时运行在主线程和另一个线程。(如果10个数字随机交叉不明显,可以增加到100试试)

    2.暂停线程

     这里展示如何让一个线程等待一段时间而不用消耗操作系统资源。

    using System;
    using System.Threading;
    
    namespace MutiThreadDemo
    {
        class ThreadSleep
        {
            static void Main(string[] args)
            {
                Thread t = new Thread(PrintNumbersWithDelay);
                t.Start();
                PrintNumbers();
                Console.ReadLine();
            }
    
            static void PrintNumbers()
            {
                Console.WriteLine("Starting ...");
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(i);
                }
            }
    
            static void PrintNumbersWithDelay()
            {
                Console.WriteLine("Starting ...");
                for(int i = 0; i < 10; i++)
                {
                    Thread.Sleep(TimeSpan.FromSeconds(2));
                    Console.WriteLine(i);
                }
            }
        }
    }

    在PrintNumbersWithDeplay方法中加入了Thread.Sleep方法调用。这会导致线程在执行该代码时,在打印任何数字之前会等待指定的时间(这里是2秒钟)。

    3.线程等待

    这里将展示如何让程序等待另一个程序中的计算完成,然后在代码中使用该线程的计算结果

    使用Thread.Sleep行不通,因为并不知道计算需要花费的具体时间。

    using System;
    using System.Threading;
    
    namespace MutiThreadDemo
    {
        class Thread_Join
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Starting ...");
                Thread t = new Thread(PrintNumbersWithDeplay);
                t.Start();
                t.Join();
                Console.WriteLine("Thread completed");
                Console.ReadLine();
            }
    
            static void PrintNumbersWithDeplay()
            {
                Console.WriteLine("Starting ...");
                for (int i = 1; i < 10; i++)
                {
                    Thread.Sleep(TimeSpan.FromSeconds(2));
                    Console.WriteLine(i);
                }
            }
    
        }
    }

    运行结果:

     当程序运行时,启动了一个耗时较长的线程来打印数字,打印每个数字前要等待两秒。

    但是我们在主程序中调用了 t.Join 方法,该方法允许我们等待直到线程 t 完成。

    当线程 t 完成时,主程序会继续运行。

    借助该技术可以实现在两个线程间同步执行步骤。

    4.终止线程

    ...

  • 相关阅读:
    排序算法最强总结及其代码实现
    程序员面试常问的小算法总结
    Docker部署Scrapy-redis分布式爬虫框架(整合Selenium+Headless Chrome网页渲染)
    使用亚马逊AWS云服务器进行深度学习——免环境配置/GPU支持/Keras/TensorFlow/OpenCV
    阿里巴巴MySQL开源中间件Canal入门
    【秒杀系统】秒杀系统实战(四)| 缓存与数据库双写一致性实战
    【秒杀系统】秒杀系统实战(五)| 如何优雅的完成订单异步处理
    把购买数据添加到购物车
    实现自动登陆和记住用户名功能
    自定义登陆标签
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/11701438.html
Copyright © 2011-2022 走看看