多线程应用程序,可以提高程序的响应速度,也就提高了用户的体验。在多用户或者有耗时操作时,使用多线程提高程序的响应速度是不二的选择。一个程序员不懂多线程,不是一个合格的程序员。所以,哥也要学习多线程了。
构建一个简单的多线程程序
1using System; 2using System.Threading; 3 4namespace CSharpConsoleTestingCodes 5
以上就是一个简单的多线程程序。由于注释比较详细就不一一讲解了。
执行结果如图(结果不会完全一样,因为线程切换的时间和顺序是不定的):
不过有几点是要注意的:
- 创建线程时使用的代码为 Thread td = new Thread(worker.DoWork); 而不是DoWork(),初学者容易写为 new Thread(worker.DoWork()); 这是因为在Thread的构造函数中使用的是ThreadStart类型的委托,可以理解为C中的函数指针,传递给线程执行。 以后我们会发现,多线程中委托是很重要的角色。
-
Worker类中的mShouldStop数据成员被声明为了 volatile ,因为这个变量同时被主线程和辅助线程访问和修改。以下是MSDN上的解释:
volatile 关键字用于通知编译器,将有多个线程访问 mShouldStop 数据成员,因此它不应当对此成员的状态做任何优化假设。有关更多信息,请参见 volatile(C# 参考)。
通过将 volatile 与 mShouldStop 数据成员一起使用,可以从多个线程安全地访问此成员,而不需要使用正式的线程同步技术,但这仅仅是因为 mShouldStop 是 bool。这意味着只需要执行单个原子操作就能修改 mShouldStop 。但是,如果此数据成员是类、结构或数组,那么,从多个线程访问它可能会导致间歇的数据损坏。假设有一个更改数组中的值的线程。Windows 定期中断线程,以便允许其他线程执行,因此线程会在分配某些数组元素之后和分配其他元素之前被中断。这意味着,数组现在有了一个程序员从不想要的状态,因此,读取此数组的另一个线程可能会失败。
-
最后使用Join()方法结束辅助线程。以下是MSDN上的解释:
还可以通过调用 Abort 来从一个线程终止另一个线程,但这会强行终止受影响的线程,而不管它是否已完成自己的任务,并且不提供清理资源的机会。此示例中显示的技术是首选方法。
最后,Main 函数对辅助线程对象调用 Join 方法。此方法导致当前线程阻塞或等待,直到对象所表示的线程终止。因此,直到辅助线程返回后,Join 才会返回,然后自行终止
|
请发表评论