首页 > 编程语言 >c#关于同步 /异常/多线程/事件 事例

c#关于同步 /异常/多线程/事件 事例

时间:2024-08-28 15:05:41浏览次数:7  
标签:c# sw void AppendLine private 事例 book Stopwatch 多线程

sync 同步

async 异步 ,要与 await 成对使用

Thread 

//计算程序执行时间

StopWatch  sw= StopWatch.Start();

转自:https://codeload.github.com/zhaoxueliang86/WinFormsAsyncAwait/zip/refs/heads/Bilibili

B站 UP主:银色 

using System.Diagnostics;
using System.Text;

namespace WinFormsAsyncAwait
{
    public partial class FormThread : Form
    {
        public FormThread()
        {
            InitializeComponent();

            Data.Books.ForEach(book => { book.EventCompleted += Book_EventCompleted; });
        }
        private void Book_EventCompleted(object? sender, Book.BookEventArgs e)
        {
            AppendLineThread(e.Result!);
        }

        /// <summary>
        /// 同步
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnSync_Click(object sender, EventArgs e)
        {
            Stopwatch sw = Stopwatch.StartNew();    //计时器
            resultTextBox.Clear();
            AppendLine("同步检索开始......");
            int idx = 0;

            Data.Books.ForEach(book => AppendLine($"{++idx}.{book.Search()}"));

            sw.Stop();
            AppendLine($"同步检索完成:{Convert.ToSingle(sw.ElapsedMilliseconds) / 1000}秒");
        }
        /// <summary>
        /// 异步
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void BtnAsync_Click(object sender, EventArgs e)
        {
            Stopwatch sw = Stopwatch.StartNew();
            resultTextBox.Clear();
            AppendLine("异步检索开始......");
            AppendLine($"ThreadId:{Environment.CurrentManagedThreadId}");

            int idx = 0;

            foreach (var book in Data.Books)
            {
                var task = await Task.Run(book.Search).ConfigureAwait(true);
                
                AppendLineThread($"{++idx}.{task}        ThreadId:{Environment.CurrentManagedThreadId}");
            }

            sw.Stop();
            AppendLineThread($"异步检索完成:{Convert.ToSingle(sw.ElapsedMilliseconds) / 1000}秒");
        }
        /// <summary>
        /// 异步
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnAsyncCallbak_Click(object sender, EventArgs e)
        {
            Stopwatch sw = Stopwatch.StartNew();
            resultTextBox.Clear();
            AppendLine("异步回调检索开始......");
            int idx = 0;

            foreach (var book in Data.Books)
            {
                Task.Run(book.Search).ContinueWith(t => AppendLineThread($"{++idx}.{t.Result}"));
            }

            sw.Stop();
            AppendLine($"异步回调检索完成:{Convert.ToSingle(sw.ElapsedMilliseconds) / 1000}秒");
        }
        /// <summary>
        /// 并行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void BtnConcurrencyAsync_Click(object sender, EventArgs e)
        {
            Stopwatch sw = Stopwatch.StartNew();
            resultTextBox.Clear();
            AppendLine($"并行检索开始......");
            int idx = 0;

            List<Task<string>> Tasks = new();
            Data.Books.ForEach(book => Tasks.Add(Task.Run(book.Search)));

            var tasks = await Task.WhenAll(Tasks).ConfigureAwait(false);
            foreach (var result in tasks)
            {
                AppendLine($"{++idx}.{result}");
            }
            sw.Stop();
            AppendLine($"并行检索完成:{Convert.ToSingle(sw.ElapsedMilliseconds) / 1000}秒");
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnConcurrencyCallback_Click(object sender, EventArgs e)
        {
            Stopwatch sw = Stopwatch.StartNew();
            resultTextBox.Clear();
            AppendLine("并行回调检索开始......");

            int idx = 0;
            List<Task<string>> Tasks = new();
            foreach (var book in Data.Books)
            {
                Tasks.Add(Task.Run(book.Search));
            }

            Task.WhenAll(Tasks).ContinueWith(t =>
            {
                foreach (var result in t.Result)
                {
                    AppendLine($"{++idx}.{result}");
                }
                sw.Stop();
                AppendLine($"并行回调检索完成:{Convert.ToSingle(sw.ElapsedMilliseconds) / 1000}秒");
            });
        }

        private void AppendLine(string text)
        {
            resultTextBox.AppendText(string.IsNullOrEmpty(resultTextBox.Text) ? text : $"{Environment.NewLine}{text}");
            resultTextBox.ScrollToCaret();       //把控件内容滚动到当前插入符号位置
            resultTextBox.Refresh();
        }

        private void AppendLineThread(string text)
        {
            this.BeginInvoke(() => AppendLine(text));
        }

        private async void BtnEvent_Click(object sender, EventArgs e)
        {
            Stopwatch sw = Stopwatch.StartNew();
            resultTextBox.Clear();
            AppendLine("检索开始......");

            List<Task> Tasks = new();
            foreach (var book in Data.Books)
            {
                Tasks.Add(Task.Run(book.SearchEvent));
            }
            await Task.WhenAll(Tasks);
            sw.Stop();
            AppendLine($"检索完成:{Convert.ToSingle(sw.ElapsedMilliseconds) / 1000}秒");
        }


        private StringBuilder strResult = new();
        private void Test_ConfigureAwait(object sender, EventArgs e)
        {
            bool state = ((Button)sender).Text == "True";
            strResult.Clear();
            strResult.AppendLine($"【{Environment.CurrentManagedThreadId}】主线程开始:ConfigureAwait({state.ToString()})");
            
            ChildMethod(state);
            
            strResult.AppendLine($"【{Environment.CurrentManagedThreadId}】主线程开始等待");
            
            Thread.Sleep(3000);
            
            strResult.AppendLine($"【{Environment.CurrentManagedThreadId}】主线程结束");
            MessageBox.Show("success","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
        }
        private async void ChildMethod(bool state)
        {
            strResult.AppendLine($"【{Environment.CurrentManagedThreadId}】ChildMethod开始");

            Stopwatch sw = Stopwatch.StartNew();

            await Task.Run(() =>
            {
                strResult.AppendLine($"【{Environment.CurrentManagedThreadId}】子线程开始");
                Thread.Sleep(2000);
                strResult.AppendLine($"【{Environment.CurrentManagedThreadId}】子线程结束");
            }).ConfigureAwait(state);

            sw.Stop();
            strResult.AppendLine($"【{Environment.CurrentManagedThreadId}】ChildMethod结束{sw.ElapsedMilliseconds}");
        }

        private void BtnPrint_Click(object sender, EventArgs e)
        {
            AppendLine(strResult.ToString());
        }
    }
}

 

标签:c#,sw,void,AppendLine,private,事例,book,Stopwatch,多线程
From: https://www.cnblogs.com/lrzy/p/18384706

相关文章

  • CAS server如何自定义Controller控制器
    CASserver如何自定义Controller控制器在实际开发过程中,CASServer4.0.0服务端提供了登录、认证等功能,但是我们希望加入更多的自定义功能,如自定义第三方登录服务等功能。增加一个Controller类控制器以及修改部分配置来完成CASServer4.0.0自定义Controller扩展,废话就不多说了,......
  • 超全的ChatGPT论文润色提示词
    在学术写作中,润色是提升文章质量的重要步骤。通过适当润色,不仅可以提升文章的学术水平,还能增强逻辑连贯性、优化语法结构,并提升文章的原创性。本文将详细介绍如何利用明确、具体的指令,让ChatGPT精准润色学术论文,覆盖90.1%的常见润色场景,助你撰写出理想的论文。 虽然知道chat......
  • BeanUtils.copyProperties方法
    BeanUtils.copyProperties方法通常是通过反射(Reflection)实现的。这个方法是ApacheCommonsBeanUtils库中的一个核心功能,它允许开发者在运行时动态地访问和操作对象的属性和方法。通过使用反射,BeanUtils.copyProperties能够检查对象的类定义,找出可用的getter和setter......
  • 高斯坐标转WGS84 GPS坐标 C#版本 python版本和C++版本 3度带进行投影 三个版本的代码
    找了很久,都没有很靠谱的版本,这个是自己从C#版本转换的另外两个版本完整代码可以用经过了对比核对计算,确保3个版本之间的计算结果是一致的C#版本:GPSPointGSXYToGPS(doubleX,doubleY,doubleL0){//X=571879.3482847388;//Y=2770741.66......
  • vxe-grid expandContent自定义展开的高度,以及展开的内容不要多于父vxe-grid会出现水平
    1、先上一张图,展示下效果:VxeTablev4.6默认是自适应高度的,也就是说我们只要指定展开的内容的最小高度就可以了。这样就可以保证展开的高度不会来回切换,并且我们可以限制容器里的内容的高度来实现。<stylelang="less"scoped>.sub-table{min-height:350px;......
  • nginx平滑升级+location案例
    这里是接着上一边文章的实验继续做的一、步骤1、获取之前的编译参数2、下载新模块3、重新编译软件,加上–add-module=新模块的解压路径4、停止服务并备份原程序5、把源程序用新程序覆盖6、启动新程序二、搭建nginxnginx搭建详情:http://t.csdnimg.cn/B1QsL三、平滑......
  • TransmittableThreadLocal实现父子线程之间数据传递
    1、引入依赖<dependency><groupId>com.alibaba</groupId><artifactId>transmittable-thread-local</artifactId><version>2.14.5</version></dependency>2、传递String参数publicclassTransmittableThreadLocalDe......
  • 单调队列--滑动窗口最大值(leetcode23)
    目录一、单调队列介绍二、题目应用1.题目描述2.解题碎碎念3.代码示例三、扩展1.与优先队列区别2.单调队列其他题目一、单调队列介绍单调队列是一种特殊的队列数据结构,它能够在常数时间内找到队列中的最值。单调队列可以用来解决一些与最值相关的问题,例如滑动窗口最......
  • c#入门篇5
    目录一、常量二、枚举 1、枚举类型和int以及string类型之间的转换2、注意事项强制转换(ExplicitCasting):Enum.Parse 和 Enum.TryParse: 三、结构定义方式:结构体使用 struct 关键字进行定义。结构体通常用于表示小型、轻量级的数据类型 值类型:结构体是值类型,这意......
  • OceanBase应用断链无cs_id分析
    今天是第一次写博,在OB工作也有一段时间了,国产数据库相对于oracle,mysql这些可能在排查难度方面可能是较高,但是也有一定的技巧。每天处理过的应用断连问题也有一定的量,全链路诊断其实是一个比较复杂的过程,在可能无法判断的时候,抓包是一个很重要的手段,但是断链一般是偶现,抓包的困难......