C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)

 更新时间:2023年09月04日 09:05:53   作者:CHHC  
这篇文章主要介绍了C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)

代码如下所示:

using System;
using System.Threading;
using System.Windows.Forms;
using UtilForm.Util;
namespace UtilForm
{
    // 线程同步,事件触发,信号量,互斥锁,共享内存,消息队列
    public partial class frmUIThread : Form
    { 
        SynchronizationContext context;// 子线程同步到主线程 
        public delegate void DoSth(object sender); // 事件触发
        public event DoSth OnMyEvent;
        Mutex mutex = new Mutex(); // 互斥锁,锁住某一资源 
        ManualResetEvent manualReset = new ManualResetEvent(false); // 信号量,流程上锁定,A执行完再执行B  
        public frmUIThread()
        {
            InitializeComponent();
        }
        private void MainForm_Load(object sender, EventArgs e)
        { 
            context = SynchronizationContext.Current; 
            OnMyEvent += new DoSth(ProgressEvent);
            Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);
            // 线程同步
            ThreadPool.QueueUserWorkItem(state =>
            {
                Console.WriteLine("子线程id:" + Thread.CurrentThread.ManagedThreadId);
                for (int i = 0; i < 3; ++i)
                {
                    //textBox1.Text = i.ToString();//:“线程间操作无效: 从不是创建控件“textBox1”的线程访问它。”
                    //
                    // 写法1:
                    //textBox1.BeginInvoke((MethodInvoker)delegate
                    //{
                    //    textBox1.Text = i.ToString();
                    //});
                    //
                    //
                    // 写法2:
                    context.Send(ProgressUI, i);
                    if (2 == i)
                    {
                        OnMyEvent(i);// 线程间回调
                    }
                    Thread.Sleep(100);
                }
            });
            // 模拟互斥量
            ThreadPool.QueueUserWorkItem(new WaitCallback(ThdMutex));
            ThreadPool.QueueUserWorkItem(new WaitCallback(ThdMutex));
            // 模拟信号量在B流程中阻塞,A流程结束,继续B流程
            ThreadPool.QueueUserWorkItem(state =>
            {
                Console.WriteLine("模拟信号量,A开始执行");
                Thread.Sleep(5000);
                manualReset.Set();// 释放
                Console.WriteLine("模拟信号量,A执行完成");
            });
            ThreadPool.QueueUserWorkItem(state =>
            {
                Console.WriteLine("模拟信号量,B等待执行");
                manualReset.Reset();// 重置信号量 
                manualReset.WaitOne();// 停止
                //manualReset.WaitOne(2000);// 带超时停止
                Console.WriteLine("模拟信号量,B执行完成");
            }); 
            // 共享内存 
            ThreadPool.QueueUserWorkItem(state =>
            {
                MemoryCacheHelper.SetCache("10001", "123");
            });
            ThreadPool.QueueUserWorkItem(state =>
            {
                Thread.Sleep(5000);
                var val = MemoryCacheHelper.GetCache("10001");
                Console.WriteLine($"共享内存:{val}");
            });
        }
        /// <summary>
        /// 更新UI
        /// </summary>
        /// <param name="obj"></param>
        private void ProgressUI(object obj)
        {
            Console.WriteLine("更新UI线程::当前线程id:" + Thread.CurrentThread.ManagedThreadId);
            textBox1.Text = obj.ToString();
        }
        /// <summary>
        /// 事件处理
        /// </summary>
        private void ProgressEvent(object sender)
        {
            Console.WriteLine($"线程事件触发:{sender.ToString()}");
        }
        void ThdMutex(object obj)
        {
            mutex.WaitOne();
            Console.WriteLine($"互斥线程 {Thread.CurrentThread.ManagedThreadId} 正在执行任务");
            Thread.Sleep(1000);
            Console.WriteLine($"互斥线程 {Thread.CurrentThread.ManagedThreadId} 任务执行完毕");
            mutex.ReleaseMutex(); 
        }
    }
}
using System;
using System.Runtime.Caching;
namespace UtilForm.Util
{
    public class MemoryCacheHelper
    {
        private static MemoryCache cache = MemoryCache.Default;// MemoryCache ObjectCache
        /// <summary>
        /// 读取缓存
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static object GetCache(string key)
        {
            var obj = cache.Get(key);
            //Console.WriteLine($"-读取缓存[{key}]:{JsonConvert.SerializeObject(obj, Formatting.Indented)}");
            return obj;
        }
        /// <summary>
        /// 写入缓存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <param name="timeout">过期时间,默认7200秒</param>
        public static void SetCache(string key, object obj, int timeout = 7200)
        {
            cache.Set(key, obj, DateTimeOffset.Now.AddSeconds(timeout));
            //Console.WriteLine($"-写入缓存[{key}]:{JsonConvert.SerializeObject(obj, Formatting.Indented)}");
        }
        /// <summary>
        /// 删除缓存
        /// </summary>
        /// <param name="key"></param>
        public static void RemoveCache(string key)
        {
            cache.Remove(key);
            //Console.WriteLine($"-移除缓存[{key}]");
        }
    }
}

到此这篇关于C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)的文章就介绍到这了,更多相关C#多线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#程序中使用LINQ to XML来查询XML格式数据的实例

    C#程序中使用LINQ to XML来查询XML格式数据的实例

    这篇文章主要介绍了C#程序中使用LINQ to XML来查询XML格式数据的实例,LINQ to XML是.NET框架中集成的接口,可以将XML数据放到内存中进行处理,需要的朋友可以参考下
    2016-03-03
  • C# 开发圆角控件(窗体)的具体实现

    C# 开发圆角控件(窗体)的具体实现

    这篇文章主要介绍了C# 开发圆角控件的具体实现,需要的朋友可以参考下
    2014-02-02
  • 在C#中 webbrowser的使用心得

    在C#中 webbrowser的使用心得

    最近用webbrowser做了个东西,期间有点小曲折,而且网上的解决方法也基本都是浅尝辄止,特此在这里发一下同大家分享。

    2013-04-04
  • C#语言MVC框架Aspose.Cells控件导出Excel表数据

    C#语言MVC框架Aspose.Cells控件导出Excel表数据

    这篇文章主要为大家详细介绍了C#语言MVC框架Aspose.Cells控件导出Excel表数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C#的四种基本数据类型

    C#的四种基本数据类型

    本文主要介绍了C#的四种基本数据类型的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • c#标准idispose模式使用示例

    c#标准idispose模式使用示例

    下面将把C#里实现IDispose模式的代码展现出来,大家一起来学习一下,它的使用场合也很多的,当我们手动对网站,数据库作封装时,都会用的到
    2014-02-02
  • C#操作XML文件实例汇总

    C#操作XML文件实例汇总

    这篇文章主要介绍了C#操作xml文件实例,包括了对XML文件节点的查找、遍历、删除、添加等。是C#程序设计中非常重要的技巧,需要的朋友可以参考下
    2014-08-08
  • C#多线程学习之(一)多线程的相关概念分析

    C#多线程学习之(一)多线程的相关概念分析

    这篇文章主要介绍了C#多线程学习之多线程的相关概念,涉及C#中多线程的相关概念与使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • 基于WPF实现控件轮廓跑马灯动画效果

    基于WPF实现控件轮廓跑马灯动画效果

    这篇文章主要介绍了如何利用WPF实现控件轮廓跑马灯动画效果,文中的示例代码讲解详细,对我们学习或工作有一定帮助,需要的可以参考一下
    2022-08-08
  • C# HttpClient Post参数同时上传文件的实现

    C# HttpClient Post参数同时上传文件的实现

    这篇文章主要介绍了C# HttpClient Post参数同时上传文件的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06

最新评论