成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

揭秘C#線程通信:從互斥鎖到消息傳遞,一篇就夠了!

開發(fā)
本文將帶大家深入了解C#中線程通信的多種方式,并通過實(shí)例代碼展示其應(yīng)用。

在C#中,線程之間的通信是實(shí)現(xiàn)多線程應(yīng)用程序的關(guān)鍵環(huán)節(jié)。線程通信不僅確保數(shù)據(jù)的安全性和一致性,還是實(shí)現(xiàn)多線程協(xié)作和同步的重要手段。本文將帶你深入了解C#中線程通信的多種方式,并通過實(shí)例代碼展示其應(yīng)用。

1. 互斥鎖(Mutex)和監(jiān)視器(Monitor)

互斥鎖和監(jiān)視器是C#中實(shí)現(xiàn)線程同步的基本機(jī)制。它們可以防止多個(gè)線程同時(shí)訪問共享資源,從而避免數(shù)據(jù)競爭和不一致。

示例代碼:使用Monitor實(shí)現(xiàn)線程同步

public class Counter
{
    private int _count = 0;

    public void Increment()
    {
        Monitor.Enter(this);
        try
        {
            _count++;
            Console.WriteLine($"Count: {_count} by thread {Thread.CurrentThread.ManagedThreadId}");
        }
        finally
        {
            Monitor.Exit(this);
        }
    }
}

// 使用示例
var counter = new Counter();

Task.Run(() => counter.Increment());
Task.Run(() => counter.Increment());

2. 信號量(Semaphore)和信號量Slim(SemaphoreSlim)

信號量和信號量Slim用于控制對共享資源的訪問數(shù)量。它們允許多個(gè)線程同時(shí)訪問資源,但會(huì)限制訪問的最大數(shù)量。

示例代碼:使用SemaphoreSlim限制并發(fā)訪問

public class ResourcePool
{
    private SemaphoreSlim _semaphore = new SemaphoreSlim(3); // 限制最大3個(gè)線程同時(shí)訪問

    public async Task AccessResourceAsync()
    {
        await _semaphore.WaitAsync(); // 等待信號量可用
        try
        {
            // 訪問共享資源
            Console.WriteLine($"Accessing resource by thread {Thread.CurrentThread.ManagedThreadId}");
            await Task.Delay(1000); // 模擬耗時(shí)操作
        }
        finally
        {
            _semaphore.Release(); // 釋放信號量
        }
    }
}

// 使用示例
var pool = new ResourcePool();

var tasks = Enumerable.Range(1, 10).Select(i => pool.AccessResourceAsync()).ToArray();
await Task.WhenAll(tasks);

3. 線程間消息傳遞

在C#中,可以通過多種方式實(shí)現(xiàn)線程間的消息傳遞,如使用QueueUserWorkItem、ThreadPool、BlockingCollection或Channel等。

示例代碼:使用BlockingCollection進(jìn)行線程間消息傳遞

public class MessageProducerConsumer
{
    private BlockingCollection<string> _messages = new BlockingCollection<string>();

    public void StartProducer()
    {
        Task.Run(() =>
        {
            for (int i = 0; i < 10; i++)
            {
                _messages.Add($"Message {i}"); // 生產(chǎn)消息
                Thread.Sleep(500); // 模擬耗時(shí)操作
            }
            _messages.CompleteAdding(); // 表示不再添加消息
        });
    }

    public void StartConsumer()
    {
        Task.Run(() =>
        {
            foreach (var message in _messages.GetConsumingEnumerable())
            {
                Console.WriteLine($"Consumed: {message} by thread {Thread.CurrentThread.ManagedThreadId}");
            }
        });
    }
}

// 使用示例
var producerConsumer = new MessageProducerConsumer();
producerConsumer.StartProducer();
producerConsumer.StartConsumer();

4. 事件(Event)和委托(Delegate)

事件和委托是C#中實(shí)現(xiàn)線程間解耦通信的有效方式。事件允許一個(gè)線程通知其他線程發(fā)生了某個(gè)特定的動(dòng)作或狀態(tài)變化。

示例代碼:使用事件和委托進(jìn)行線程通信

public class DataProvider
{
    public event Action<string> DataAvailable; // 定義一個(gè)事件

    public void SimulateDataGeneration()
    {
        for (int i = 0; i < 5; i++)
        {
            string data = $"Data {i}";
            DataAvailable?.Invoke(data); // 觸發(fā)事件
            Thread.Sleep(1000); // 模擬耗時(shí)操作
        }
    }
}

public class DataConsumer
{
    public void ConsumeData(string data)
    {
        Console.WriteLine($"Consumed data: {data} by thread {Thread.CurrentThread.ManagedThreadId}");
    }
}
責(zé)任編輯:趙寧寧 來源: 后端Q
相關(guān)推薦

2020-03-09 17:28:51

NoSQLMongoDB數(shù)據(jù)庫

2021-11-24 22:42:15

WorkManagerAPI

2024-09-23 08:00:00

消息隊(duì)列MQ分布式系統(tǒng)

2020-08-03 10:00:11

前端登錄服務(wù)器

2023-04-24 08:00:00

ES集群容器

2021-04-14 15:54:20

Kubernetes程序工具

2020-02-18 16:20:03

Redis ANSI C語言日志型

2022-06-20 09:01:23

Git插件項(xiàng)目

2020-05-14 16:35:21

Kubernetes網(wǎng)絡(luò)策略DNS

2023-02-10 09:04:27

2019-08-13 15:36:57

限流算法令牌桶

2022-08-01 11:33:09

用戶分析標(biāo)簽策略

2021-04-08 07:37:39

隊(duì)列數(shù)據(jù)結(jié)構(gòu)算法

2023-09-11 08:13:03

分布式跟蹤工具

2020-09-10 06:56:12

SringMVC源碼參數(shù)

2020-07-03 08:21:57

Java集合框架

2021-05-14 23:31:50

大數(shù)據(jù)計(jì)算機(jī)開發(fā)

2024-04-08 10:01:33

2019-05-14 09:31:16

架構(gòu)整潔軟件編程范式

2023-10-17 08:15:28

API前后端分離
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲第一免费播放区 | 黄网站在线观看 | 国产一区二区观看 | 黄色91在线 | 国产精品美女久久久久久免费 | 国产91久久精品一区二区 | 国产精品美女久久久免费 | 91精品国产高清久久久久久久久 | 日韩视频在线免费观看 | 毛片在线看看 | 国产一区二区在线免费观看 | 久久精品国产久精国产 | 亚洲精品视频观看 | 四虎永久免费地址 | 亚洲人在线观看视频 | 国产欧美一区二区三区在线看 | 一区二区播放 | 国产精品久久久av | 日韩一区二区不卡 | 国产精品视频一区二区三区, | 伊人超碰 | 亚洲国产欧美在线 | 九九九久久国产免费 | 99久久久无码国产精品 | 一区二区三区四区在线 | 日韩伦理电影免费在线观看 | 99欧美精品| 国产精品久久久久久久免费观看 | 在线视频一区二区三区 | 视频一二区 | 999精品在线观看 | 国产日韩欧美综合 | 国产精品免费在线 | 久久成人精品一区二区三区 | 午夜精品久久久久久久久久久久久 | 日韩欧美一区二区三区免费观看 | 国产精品久久久久久久久久尿 | 亚洲欧美中文日韩在线v日本 | 精品av| 欧美日韩1区 | 国产色 |