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

...

 

posted @   Vincent-yuan  阅读(652)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示