简介
在编写应用程序实现业务功能过程中,为解决吞吐量和响应效率的问题,我们会用到多线程、异步编程两项重要的技术。通过它们来提高应用程序响应和高效。应用程序每次运行都会启动一个进程(进程是一种正在执行的程序),而进程中可以包含一个或多个线程,由应用程序入口直接或间接执行的命令都由默认线程(或主线程)执行。
线程概述
线程是任务调度和执行的基本单位。线程是进程的一部分,线程共享该进程的资源。使用多线程技术可解决部分代码同时执行的需求,更好地利用资源。在介绍 C# 线程相关技术点前,先梳理同步、异步、线程安全等几个概念。
1、同步是指多个线程严格按照顺序依次执行,当前线程执行完成后再执行下一个线程。
2、异步是指多个线程的执行顺序是不确定的,每个线程都独立执行,互不干扰。
3、线程安全是指多线程访问共享资源时,保证数据的一致性和完整性,避免出现数据竞争和不一致的结果。
4、争用条件是指多个线程共享访问同一数据时,每个线程都尝试操作该数据,从而导致数据被破坏。
实现方式
在C#语言中,可以通过 Thread 、ThreadPool、Task、Parallel 等类来实现多线程,根据具体特点和场景选择合适的方式来实现。
使用 Thread
通过Thread类实例化 Thread 对象是在构造方法中传入委托对象,Thread 类的构造方法的参数 ThreadStart(无参无返回值的委托)和 ParameterizedThreadStart(有一个object类型参数但无返回值的委托)两种。
通过示例来了解实现无参数的线程
using System;
using System.Threading;
using System.Windows.Forms;
namespace Fountain.WinForm.ThreadApp
{
public partial class ThreadForm : Form
{
public ThreadForm()
{
InitializeComponent();
}
/// <summary>
/// 显示时间
/// </summary>
public void DisplayTime()
{
try
{
while (true)
{
this.LabelCurrentTime.Invoke(new EventHandler(delegate
{
// 访问主界面的控件
this.LabelCurrentTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}));
Thread.Sleep(10);
}
}
catch
{
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ThreadForm_Load(object sender, EventArgs e)
{
try
{
// 形式一
Thread thread = new Thread(DisplayTime);
// 设置为后台线程
thread.IsBackground = true;
// 开启线程
thread.Start();
// Lambda表达式代替方法DisplayTime
Thread lambdaThread =new Thread(()=>
{
this.LabelThreadId.Invoke(new EventHandler(delegate
{
// 访问主界面的控件