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 @ 2019-10-18 23:54 Vincent-yuan 阅读(...) 评论(...) 编辑 收藏