• C#的ThreadStart 和 Thread


    多线程,new Thread(t1);和new Thread(new ThreadStart(t1));有什么区别

    没有区别。
    前者,是c#的语法。也就是说是编译器帮你改写为第二种形式。
    因此你要搞清楚,这是.net的特性还是c#的特性。这是c#得特性,如果有人以为第一种写法“是.net的”那他就错了。

    .net中根本不支持 new Thread(t1); 这种代码,这是c#编译器支持的。类似的东西也有很多。所以说c#比较优雅,是指这个部分。

    要分清楚“什么是c#的,什么是.net的”,你能更好地理解c#,也能更好地理解.net。

    在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用C#
    Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。

    你要搞清楚ThreadStart是一个委托。虽然它叫Thread,但是它其实是一个普普通通的委托类型。
    就好比
    button.Click += button1_Click;

    button1.Click += new EventHandler(button1_Click);

    打开你的VS.net,新建一个控制台应用程序(Console Application),编写完全控制一个线程的代码示例:

    using System;  

    using System.Threading;   

    namespace ThreadTest  

    {  

    public class Alpha  

    {  

    public void Beta()  

    {  

    while (true)  

    {  

    Console.WriteLine("Alpha.Beta is running in its own thread.");  

    }  

    }  

    };   

    public class Simple  

    {  

    public static int Main()  

    {  

    Console.WriteLine("Thread Start/Stop/Join Sample");  

    Alpha oAlpha = new Alpha();  

    //这里创建一个线程,使之执行Alpha类的Beta()方法  

    Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));  

    oThread.Start();  

    while (!oThread.IsAlive)  

    Thread.Sleep(1);  

    oThread.Abort();  

    oThread.Join();  

    Console.WriteLine();  

    Console.WriteLine("Alpha.Beta has finished");   

    try   

    {  

    Console.WriteLine("Try to restart the Alpha.Beta thread");  

    oThread.Start();  

    }  

    catch (ThreadStateException)   

    {  

    Console.Write("ThreadStateException trying to restart Alpha.Beta. ");  

    Console.WriteLine("Expected since aborted threads cannot be restarted.");  

    Console.ReadLine();  

    }  

    return 0;  

    }  

    }  

    这段程序包含两个类Alpha和Simple,在创建线程oThread时我们用指向Alpha.Beta()方法的初始化了 ThreadStart代理(delegate)对象,当我们创建的线程oThread调用C# Thread.Start()方法启动时,实际上程序运行的是Alpha.Beta()方法:

    1. Alpha oAlpha = new Alpha();  
    2. Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));  
    3. oThread.Start();  

    然后在Main()函数的while循环中,我们使用静态方法Thread.Sleep()让主线程停了1ms,这段时间CPU转向执行线程 oThread。然后我们试图调用Thread.Abort()方法终止线程oThread,注意后面的 oThread.Join(),Thread.Join()方法使主线程等待,直到oThread线程结束。你可以给Thread.Join()方法指定一个int型的参数作为等待的最长时间。之后,我们试图用C# Thread.Start()方法重新启动线程oThread,但是显然Abort()方法带来的后果是不可恢复的终止线程,所以最后程序会抛出 ThreadStateException异常。

  • 相关阅读:
    详解PhpStudy集成环境升级MySQL数据库版本
    Mysql5.5升级到5.7的过程已经踩到的坑
    phpStudy中升级MySQL版本到5.7.17的方法步骤
    Windows上使用Vagrant打造Laravel Homestead可协同跨平台开发环境
    百度云下载加速的
    libsvm的安装,数据格式,常见错误,grid.py参数选择,c-SVC过程,libsvm参数解释,svm训练数据,libsvm的使用详解,SVM核函数的选择
    RBF神经网络的matlab简单实现
    spark mllib docs,MLlib: RDD-based API
    目前所有的ANN神经网络算法大全
    Spark1.6.1 MLlib 特征抽取和变换
  • 原文地址:https://www.cnblogs.com/rosesmall/p/8358348.html
Copyright © 2020-2023  润新知