C#实现多线程编程的简单案例

下面是 C# 实现多线程编程的简单案例的攻略,分为以下几个步骤:

1. 确定需求及问题

在开始之前,需要确定要实现的需求和问题,这样才能更有针对性地编写代码。例如,本次案例要实现的问题可能是:在一个列表中,同时处理多个元素的计算任务,并等待所有计算任务完成后,将结果汇总并输出。

2. 创建多线程

在确定了需求和问题后,需要使用 C# 中的多线程机制来实现。创建线程有两种方法:

  1. 继承 Thread 类:可以定义一个类继承 Thread 类,并覆盖其运行方法 Run(),在此方法中执行需要多线程执行的代码。通过实例化该子类,并调用其 Start() 方法,即可启动一个新的线程。

下面是继承 Thread 类创建多线程的示例代码:

using System;
using System.Threading;

public class MyThread : Thread {
    public string message;

    public MyThread(string message) {
        this.message = message;
        // 在构造函数中,初始化线程对象并设置名称
        this.Name = "MyThread";
        // 设置为后台线程(如果不设置,默认是前台线程)
        this.IsBackground = true;
    }

    // 定义运行方法
    public override void Run() {
        Console.WriteLine(message);
    }
}

// 在主线程中启动 MyThread
public class Program {
    static void Main(string[] args) {
        MyThread mt = new MyThread("Hello, World!");
        mt.Start();
    }
}
  1. 创建委托和线程池:创建一个委托,该委托中执行需要多线程执行的代码,再通过线程池中的线程来执行该委托。

下面是使用线程池创建多线程的示例代码:

using System;
using System.Threading;

public class MyThreadPool {
    public static void DoWork(object state) {
        string message = (string)state;
        Console.WriteLine(message);
    }
}

// 在主线程中使用线程池来执行任务
public class Program {
    static void Main(string[] args) {
        // 将要执行的任务添加到线程池中
        ThreadPool.QueueUserWorkItem(new WaitCallback(MyThreadPool.DoWork), "Hello, World!");
        // 确保所有任务都完成了,再执行下一步操作
        ThreadPool.WaitAll(new WaitHandle[0], 5000);
    }
}

3. 多线程间的同步

在多线程编程中,线程间的同步是非常重要的。为了防止线程间访问同一共享资源,导致数据错乱,需要使用特定的方法来进行同步。C# 中常见的同步机制有:

  1. lock 关键字:用于给对象加锁,避免多个线程同时访问造成数据冲突。

下面是使用 lock 关键字进行同步的示例代码:

using System;
using System.Threading;

public class Counter {
    public int count;

    public Counter() {
        count = 0;
    }

    // 原子操作运算
    public void Increment() {
        lock (this) {
            count++;
        }
    }

    // 输出计数器的值
    public void PrintCount() {
        Console.WriteLine("count: " + count);
    }
}

// 使用 Counter 类和 lock 关键字在多线程中同步计数器
public class Program {
    static void Main(string[] args) {
        Counter counter = new Counter();

        // 创建多个线程来执行计数器的增加操作
        Thread t1 = new Thread(new ThreadStart(() => {
            for (int i = 0; i < 100000; i++) {
                counter.Increment();
            }
        }));

        Thread t2 = new Thread(new ThreadStart(() => {
            for (int i = 0; i < 100000; i++) {
                counter.Increment();
            }
        }));

        t1.Start();
        t2.Start();

        // 等待所有线程执行完成
        t1.Join();
        t2.Join();

        // 输出计数器的结果
        counter.PrintCount();
    }
}
  1. Interlocked 类:提供了多种原子性操作方法,可以用于在多线程中进行同步。

下面是使用 Interlocked 类进行同步的示例代码:

using System;
using System.Threading;

public class Counter {
    public int count;

    public Counter() {
        count = 0;
    }

    // 原子操作运算
    public void Increment() {
        Interlocked.Increment(ref count);
    }

    // 输出计数器的值
    public void PrintCount() {
        Console.WriteLine("count: " + count);
    }
}

// 使用 Counter 类和 Interlocked 类在多线程中同步计数器
public class Program {
    static void Main(string[] args) {
        Counter counter = new Counter();

        // 创建多个线程来执行计数器的增加操作
        Thread t1 = new Thread(new ThreadStart(() => {
            for (int i = 0; i < 100000; i++) {
                counter.Increment();
            }
        }));

        Thread t2 = new Thread(new ThreadStart(() => {
            for (int i = 0; i < 100000; i++) {
                counter.Increment();
            }
        }));

        t1.Start();
        t2.Start();

        // 等待所有线程执行完成
        t1.Join();
        t2.Join();

        // 输出计数器的结果
        counter.PrintCount();
    }
}

4. 示例应用

下面是一个简单示例应用,实现了在一个列表中,同时处理多个元素的计算任务,并等待所有计算任务完成后,将结果汇总并输出。

using System;
using System.Collections.Generic;
using System.Threading;

public class Task {
    public int taskId { get; set; }
    public int input { get; set; }
    public int result { get; set; }
    public ManualResetEventSlim evt { get; set; }

    // 构造方法
    public Task(int id, int input) {
        taskId = id;
        this.input = input;
        evt = new ManualResetEventSlim(false);
    }

    // 计算任务的方法
    public void Compute() {
        Thread.Sleep(500); // 模拟耗时计算
        result = input * input;
        evt.Set(); // 完成任务时,通知等待的线程
    }
}

public class Program {
    static void Main(string[] args) {
        // 创建任务列表
        List<Task> taskList = new List<Task>();
        for (int i = 1; i <= 10; i++) {
            taskList.Add(new Task(i, i));
        }

        // 执行计算任务
        foreach (Task task in taskList) {
            ThreadPool.QueueUserWorkItem(new WaitCallback((object state) => {
                Task t = (Task)state;
                t.Compute();
            }), task);
        }

        // 等待所有计算任务完成
        foreach (Task task in taskList) {
            task.evt.Wait();
        }

        // 输出结果
        int sum = 0;
        foreach (Task task in taskList) {
            Console.WriteLine("Task {0}: input={1}, result={2}", task.taskId, task.input, task.result);
            sum += task.result;
        }
        Console.WriteLine("Sum: " + sum);
    }
}

以上就是 C# 实现多线程编程的简单案例的攻略,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现多线程编程的简单案例 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#中volatile与lock用法

    下面详细讲解一下C#中volatile与lock关键字的用法。 volatile关键字的用法 简介 在多线程编程中,由于CPU对内存的读写可能存在缓存,当多个线程同时操作同一个变量时,就可能出现线程安全问题。而volatile关键字则可以保证被修饰的变量在多线程操作中的可见性和顺序性,即保证多线程程序中的变量修改都能在所有线程中可见。 用法 volatile…

    C# 2023年6月7日
    00
  • websocket与C# socket相互通信

    web端代码就是js代码,C#有两种方式:使用第三方库,如Fleck,使用C#原生socket编程实现   web端: <!doctype html> <html lang=”zh-CN”> <head> <meta charset=”UTF-8″> <title>下发网站上文件到学生机</t…

    C# 2023年4月24日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)

    在前两篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) 我们对.netcore部署到linux有了一个充分的了解,已经可以满足应用要求了,这篇文章我们继续深入带你了解使用Doker+jexus或Nginx来部署.net co…

    C# 2023年5月6日
    00
  • 时间轻松学会.NET Core操作ElasticSearch7的方法

    时间轻松学会.NET Core操作ElasticSearch7的方法 ElasticSearch是一个流行的开源搜索引擎,它可以帮助我们在大规模数据集中进行高效的搜索和分析。本攻略将详细介绍如何在.NET Core中使用ElasticSearch7,并提供两个示例说明。 安装ElasticSearch7 在开始使用ElasticSearch7之前,我们需要先…

    C# 2023年5月16日
    00
  • ASP.NET Core实现文件上传和下载

    一、ASP.NET Core实现文件上传的完整攻略 设置文件上传的API接口 要实现文件上传,首先需要在ASP.NET Core的API接口中设置文件上传的路由路径和它所用的http请求方式。例如,下面的代码演示了如何在API接口中设置文件上传的路由路径和它所用的http请求方式。 [HttpPost] [Route("api/uploadfile…

    C# 2023年6月3日
    00
  • C#通过NPOI导入导出数据EXCEL

    下面是关于“C#通过NPOI导入导出数据EXCEL”的完整攻略,包含以下几个部分: NPOI简介 导出Excel 导入Excel 示例说明 1. NPOI简介 NPOI是一个开源的.NET库,可以用来读写Microsoft Excel、Word和PowerPoint格式的文件。对于需要在C#中读写Excel文件的开发者来说,NPOI是一个不错的选择。使用NP…

    C# 2023年5月31日
    00
  • C# List的赋值问题的解决

    下面我来详细讲解 “C# List的赋值问题的解决” 的攻略。 问题描述 在 C# 中,我们经常需要对 List 进行赋值操作。但是有一些情况下,我们尝试赋值会遇到问题,如下: List<int> list1 = new List<int>{1, 2, 3}; List<int> list2 = list1; list2.…

    C# 2023年6月6日
    00
  • ASP.NET MVC使用Quartz.NET执行定时任务

    以下是“ASP.NET MVC使用Quartz.NET执行定时任务”的完整攻略: 什么是Quartz.NET Quartz.NET是一个开源的作业调度框架,可以用于在.NET应用程序中执行定时任务。提供了一种简单而强大的方式来调度和执行作业,支持多种触发器类型,如简单触发器、Cron触发器等。 ASP.NET MVC使用Quartz.NET执行定时任务的步骤…

    C# 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部