专栏首页Vincent-yuanc#之线程基础(一)

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.终止线程

...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • async和await的使用总结 ~ 竟然一直用错了c#中的async和await的使用。。

    同步准备的早餐大约花费了 30 分钟,因为总耗时是每个任务耗时的总和。这里的total time只是用来表示记录下程序运行的时间。

    Vincent-yuan
  • java之 代理设计模式

    1. 设计一个案例来实现租房功能。分析:在租房的过程中涉及到了3个对象,房东,中介,房客。

    Vincent-yuan
  • asp.net core 系列之中间件进阶篇-编写自定义中间件(middleware)

    中间件是被用到管道(pipeline)上来处理请求(request)和响应的(response)。

    Vincent-yuan
  • 构建BaseRecyclerAdapter,RecyclerView其实很简单

      本文主要跟大家分享笔者简单搭建的BaseRecyclerAdapter。首先我们先看一下需求:

    饮水思源为名
  • 应用自动更新封装-Android

    应用更新应该是现在每个应用必备的一个功能。正是通过不断的更新,不断的调优,才使我们的应用更完善。当然在各大应用市场中,它们已经帮我们实现了这项功能,但是有一个问...

    g小志
  • 几种异步操作方式

    其实这也是面试中被问倒的问题:(贴在这里纪念一下,注:只是简单的罗列,详细原理及分析,请参阅《CLR Via c#》第三版相关章节) 1、利用线程池发起异步操...

    菩提树下的杨过
  • Android自定义带加载动画效果的环状进度条

    相关用法: setProgress(progress);//设置进度 setRadius(300);//设置半径 setStokewidth(60)...

    砸漏
  • Java基础12 类型转换与多态

    我们之前使用类创造新的类型(type),并使用继承来便利我们创建类的过程。我将在这一讲中深入类型,并介绍多态(polymorphism)的概念。

    Java团长
  • 装饰者模式及其应用

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

    程序员徐公
  • JAVA之学习system类的概述和成员方法

    吾爱乐享

扫码关注云+社区

领取腾讯云代金券