计算机编程术语“线程”是执行线程的简称,在执行线程中,处理器在代码中遵循指定的路径。一次跟踪多个线程的概念引入了多任务和多线程的主题。
应用程序中有一个或多个进程。将进程视为计算机上运行的程序。现在每个进程都有一个或多个线程。游戏应用程序可能有一个线程从磁盘加载资源,另一个线程执行AI,另一个线程作为服务器运行游戏。
在.NET/Windows中,操作系统将处理器时间分配给线程。每个线程都跟踪异常处理程序及其运行的优先级,并且在运行之前都有保存线程上下文的地方。线程上下文是线程需要恢复的信息。
线程会占用一点内存,创建它们需要一点时间,所以通常情况下,您不希望使用太多的内存。记住,它们在争夺处理器时间。如果您的计算机有多个CPU,则Windows或.NET可能在不同的CPU上运行每个线程,但如果多个线程在同一CPU上运行,则一次只能有一个线程处于活动状态,切换线程需要时间。
CPU为几百万条指令运行一个线程,然后切换到另一个线程。所有CPU寄存器、当前程序执行点和堆栈必须保存在第一个线程的某个位置,然后从其他位置恢复到下一个线程。
在命名空间系统中。线程,您将找到线程类型。构造函数线程(ThreadStart)创建线程的实例。然而,在最近的C#代码中,更可能传入一个lambda表达式,该表达式使用任何参数调用该方法。
如果您不确定lambda表达式,可能值得查看LINQ。
以下是创建和启动的线程示例:
using System; using System.Threading;namespace ex1{class Program{public static void Write1(){Console.Write('1') ;Thread.Sleep(500) ;}static void Main(string[] args){var task = new Thread(Write1) ;task.Start() ;for (var i = 0; i < 10; i++){Console.Write('0') ;Console.Write (task.IsAlive ? 'A' : 'D') ;Thread.Sleep(150) ;}Console.ReadKey() ;}}}这个示例所做的只是将“1”写入控制台。主线程向控制台写入一个“0”10次,每次后接一个“a”或“D”,具体取决于另一个线程是否仍然处于活动状态。
另一个线程只运行一次并写入一个“1”。在Write1()线程中延迟半秒后,该线程完成,主循环中的Task.IsAlive现在返回“D”
除非您真的需要,否则不要创建自己的线程,而是使用线程池。从.NET4.0中,我们可以访问任务并行库(TPL)。在前面的例子中,我们再次需要一点LINQ,是的,这都是lambda表达式。
任务在后台使用线程池,但根据使用的线程数更好地利用线程。
TPL中的主要对象是任务。这是一个表示异步操作的类。最常见的启动方式是使用Task.Factory.StartNew,如下所示:
Task.Factory.StartNew(() => DoSomething());其中DoSomething()是运行的方法。可以创建一个任务,而不是让它立即运行。在这种情况下,只需使用如下任务:
var t = new Task(() => Console.WriteLine("Hello"));...t.Start();在调用.start()之前,它不会启动线程。在下面的示例中,有五项任务。
using System;using System.Threading;using System.Threading.Tasks;namespace ex1{class Program{public static void Write1(int i){Console.Write(i) ;Thread.Sleep(50) ;}static void Main(string[] args){for (var i = 0; i < 5; i++){var value = i;var runningTask = Task.Factory.StartNew(()=>Write1(value)) ;}Console.ReadKey() ;}}}运行该命令,您将以一些随机顺序(如03214)获得数字0到4的输出。这是因为任务的执行顺序是由.NET决定的。
您可能想知道为什么需要var value=i。尝试删除它并调用Write(i),您将看到一些意想不到的东西,如55555。为什么会这样?这是因为任务在执行任务时显示i的值,而不是在创建任务时。通过每次在循环中创建一个新变量,五个值中的每一个都被正确地存储和拾取。
...a very important exception that you don't want to mess with (especially in multi-threaded applicati***) unless you know what you're doing. If you don't know which exception to catch instead, c***ider not catching anything. Use descriptive messag...
...驱动的问答网站分组。 问题 超级用户阅读器MiHa想知道如何在任务计划程序中创建任务,以实现笔记本电脑上电池电量变化: I need to create a task in Task Scheduler based on battery level changes. For example, say my laptop’s battery drops from 67 perce...
...我们有一个软件的一块困难,太!我们将带您了解我们是如何杀死我们的行为不端的程序,以便您可以使用它作为您自己的软件龙的模板。 相关:Windows任务管理器的最佳免费选项 当通过正常通道终止应用程序失败时,如您所概...
...外的硬件问题而死机,而这些问题并不是我们的错,那么如何从旧硬盘中定位和传输“罕见”或难以重新创建的文件(如计划任务)?今天的超级用户问答帖子提供了一种帮助读者追踪所需文件的解决方案。 今天的问答环节是...
...个程序在登录到Windows后立即以提升的权限自动运行,但如何设置这样的程序?今天的超级用户问答帖子对一个沮丧的读者有一些有用的建议。 今天的问答环节是由SuperUser提供的,SuperUser是Stack Exchange的一个分支,是一个由社区...
...ed mode. And this last part allows applicati*** like Windows 95 to start a multi-threaded environment even though they were basically launched from DOS. DOS (Disk Operating System) was, as far as I know, not much more than a file management system. It provided a file system, mechani**s for navigatin...
...和运行应用程序列表的精简和平均,如果是这样的话,你如何才能在应用程序繁重的启动上踩刹车? 今天的问答环节是由Android爱好者提供的,这是Stack Exchange的一个分支,Stack Exchange是一个由社区驱动的问答网站分组。 问题 Andr...
...题 超级用户读者Ell关注科技新闻,很好奇为什么我们不使用更多基于GPU的系统: 在我看来,这些天很多计算都是在GPU上完成的。显然,图形是在那里完成的,但是使用CUDA之类的,AI、散列算法(比如比特币)和其他算法也是在G...
...with how the task running on that processor works, i.e. single-threaded or multi-threaded. Amdahl’s Law is important when c***idering the types of tasks you are running. If you have a task that is inherently linear and has to be done precisely step-by-step such as (a grossly simple program) 10: ...
...者用来记录时间的技巧。 当你们中不止一个人对追踪你如何花费所有时间的想法表示困惑时,你们中的许多人非常高兴地分享你保持时间开销最高的原因和方法。 Scott使用了一种流动灵活的项目管理工具: I use kanbanflow.com, with ...