多线程,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异常。

C#的ThreadStart 和 Thread的更多相关文章

  1. ParameterizedThreadStart,ThreadStart的使用,线程Thread传参数

    Thread threadWithParam = new Thread(new ParameterizedThreadStart(new ThreadTest().ShowMsg));//thread ...

  2. ThreadStart和ParameterizedThreadStart区别

    ThreadStart: ThreadStart这个委托定义为void ThreadStart(),也就是说,所执行的方法不能有参数. ThreadStart threadStart=new Thre ...

  3. 【C#】【Thread】Monitor和Lock

    所谓锁,就是之锁定的区域只能单个线程进入进行操作,其他线程在锁的外围等待.Monitor锁通过Monitor.Enter(obj)和Monitor.Exit(obj)来锁定和解锁.Lock锁则直接Lo ...

  4. 【C#】【Thread】SynchronizationContext线程间同步

    SynchronizationContext在通讯中充当传输者的角色,实现功能就是一个线程和另外一个线程的通讯. 需要注意的是,不是每个线程都附加SynchronizationContext这个对象, ...

  5. Thread .join 的用法一例

    在使用身份证读卡器时,要求 1. 身份证读到身份证 就 停止线程. 2. 关闭界面时会 自动停止调用读身份证的线程.这时候就需要用到 Thead.join 例子如下: Thread thread; p ...

  6. Thread 线程简单例子

    //这个方法是 静态的 public static void ThreadFunc() {//计数器 ; while(true) { //休眠1秒 Thread.Sleep(); //计数器递增 co ...

  7. C# WinForm多线程(一)Thread类库

    Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括 ...

  8. 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读

    记得很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题 ...

  9. 多线程Thread,线程池ThreadPool

    首先我们先增加一个公用方法DoSomethingLong(string name),这个方法下面的举例中都有可能用到 #region Private Method /// <summary> ...

随机推荐

  1. Linux下怎么确定Nginx安装目录

    linux环境下,怎么确定nginx是以那个config文件启动的? 输入命令行: ps  -ef | grep nginx 摁回车,将出现如下图片: master process 后面的就是 ngi ...

  2. Oracle初级索引学习总结

    前言  索引是常见的数据库对象,建立索引的目的是为了提高记录的检索速度.它的设置好坏,使用是否得当,极大地影响数据库应用程序和Database的性能.虽然有许多资料讲索引的用法,DBA和Develop ...

  3. epoll的两种工作模式

    epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在採用这两种模式时要注意的是,假设採用ET模式,那么仅当状态发生变化时才会通知,而採用L ...

  4. python resize

    import sys import os sys.path.append('/usr/local/lib/python2.7/site-packages') sys.path.append('/usr ...

  5. Loader的初步学习笔记

    Loader是一个异步加载数据的类,它和AsyncTask有类似也有不同,今天我们就先来学习下它.由于是对比学习,所以我们先来复习下AsyncTask的使用和特点. 一.AsyncTask 参考自:h ...

  6. Asp.Net 获取物理路径

    一.AppDomain 1.AppDomin获取当前前程序域目录 2.不需要请求上线文实例,例如在Global.ascx中访问等 //网站物理目录 AppDomain.CurrentDomain.Ba ...

  7. django的权限认证:登录和退出。auth模块和@login_required装饰器

    在settings.py中配置LOGIN_URL参数: # 用户访问带有(@login_required)标签的页面(view)时,如果没有登录,就会跳转到LOGIN_URL(即登陆url). LOG ...

  8. 使用jupyter搭建golang的交互式界面:类似于ipython;jupyter还可以使用spark或者结合机器学习

    Jupyter Notebook The Jupyter notebook is a web-based notebook environment for interactive computing. ...

  9. RV32M指令集

    Risc-V定义了可选的RV32M,它定义了整数乘法除法指令. 总共8条指令. Category Fmt RV32I base machine code(bin) comment mul 整数乘法 R ...

  10. qt.qpa.plugin: Could not find the Qt platform plugin "windows" in ""

    转载:https://forum.qt.io/topic/97484/qt-5-12-make-mingw-32-release/12 I build Qt 5.12 with MinGW 7.3.0 ...