首页 > 编程语言 >浅谈一下c#多线程编程

浅谈一下c#多线程编程

时间:2023-06-30 17:35:39浏览次数:39  
标签:www 浅谈 c# private https 多线程 com cn

  • 概念
      • 线程:线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。
      • 同步:一定要等任务执行完了,得到结果,才执行下一个任务。如果程序执行耗时操作时会阻塞线程。

  • 应用场景
    • UI与I/O: UI发出I/O操作,I/O操作是费时任务
    • 计算密集型工作(CPU-bound):多线程

    •  IO密集型工作(I/O-bound):异步多线程机制

  • 实例代码
            public partial class MainForm : Form
            {
                /// <summary>
                /// Http连接对象
                /// </summary>
                private readonly HttpClient httpClient = new HttpClient();
        
                private readonly List<string> DownloadUrlList = new List<string>
                {
                    "https://www.jd.com",
                    "https://www.tmall.com",
                    "http://book.dangdang.com",
                    "https://www.cnblogs.com",
                    "https://www.runoob.com",
                    "https://www.csdn.net",
                    "https://www.githubs.cn",
                    "https://cn.vuejs.org",
                    "https://msdn.itellyou.cn",
                    "https://www.iconfont.cn",
                    "https://www.baidu.com",
                    "https://cn.bing.com",
                    "https://docs.microsoft.com/zh-cn/windows",
                    "https://docs.microsoft.com/zh-cn",
                    "https://docs.microsoft.com/zh-cn/dotnet/csharp",
                    "https://www.12306.cn",
                    "https://hotels.ctrip.com",
                    "http://www.shooting.org.cn",
                    "https://www.issf-sports.org",
                    "https://www.cba.net.cn",
                    "https://uland.taobao.com",
                    "https://top.baidu.com"
                };
        
                public MainForm()
                {
                    InitializeComponent();
                }
        
                private void ReportResult(string result)
                {
                    txtReport.Text += result;
                }
        
                /// <summary>
                /// 同步下载按钮点击事件
                /// </summary>
                /// <param name="sender"></param>
                /// <param name="e"></param>
                private void btnSync_Click(object sender, EventArgs e)
                {
                    txtReport.Text = "";
                    Stopwatch stopwatch = Stopwatch.StartNew();
                    Download();
                    txtReport.Text += $"Elapsed time:{stopwatch.Elapsed}.{Environment.NewLine}";
                }
        
                /// <summary>
                /// 同步下载:下载时UI线程会卡顿、直到下载结束后才恢复
                /// </summary>
                private void Download()
                {
                    foreach (var url in DownloadUrlList)
                    {
                        HttpResponseMessage response = httpClient.GetAsync(url).Result;
                        string responsePayloadBytes = response.Content.ReadAsStringAsync().Result;
                        ReportResult($"Finish downloading data for {url}.Total bytes {responsePayloadBytes.Length}.{Environment.NewLine}");
                    }
                }
        
                /// <summary>
                /// 异步下载按钮点击事件
                /// </summary>
                /// <param name="sender"></param>
                /// <param name="e"></param>
                private async void btnAsync_Click(object sender, EventArgs e)
                {
                    txtReport.Text = "";
                    Stopwatch stopwatch = Stopwatch.StartNew();
                    await DownloadAsync();
                    txtReport.Text += $"Elapsed time:{stopwatch.Elapsed}.{Environment.NewLine}";
                }
        
                /// <summary>
                /// 异步下载:
                /// 1、程序运行时不影响UI线程
                /// 2、虽然不影响UI线程,但是下载速度并没有变化
                /// </summary>
                /// <returns></returns>
                private async Task DownloadAsync()
                {
                    foreach (var url in DownloadUrlList)
                    {
                        ReportResult(await DownloadWebSitePayloadAsync(url));
                    }
                }
        
                private async Task<string> DownloadWebSitePayloadAsync(string url)
                {
                    HttpResponseMessage response = await httpClient.GetAsync(url);
                    string responsePayloadBytes = await response.Content.ReadAsStringAsync();
                    return $"Finish downloading data for {url}.Total bytes {responsePayloadBytes.Length}.{Environment.NewLine}";
                }
        
                /// <summary>
                /// 异步多线程按钮点击事件
                /// </summary>
                /// <param name="sender"></param>
                /// <param name="e"></param>
                private async void btnAsyncMultithreading_Click(object sender, EventArgs e)
                {
                    txtReport.Text = "";
                    Stopwatch stopwatch = Stopwatch.StartNew();
                    await MultithreadingDownloadAsync();
                    txtReport.Text += $"Elapsed time:{stopwatch.Elapsed}.{Environment.NewLine}";
                }
        
                /// <summary>
                /// 异步多线程:UI不会卡顿且大幅提升程序性能
                /// </summary>
                /// <returns></returns>
                private async Task MultithreadingDownloadAsync()
                {
                    List<Task<string>> downloadTasks = new List<Task<string>>();
                    DownloadUrlList.ForEach(o => downloadTasks.Add(DownloadWebSitePayloadAsync(o)));
                    var results = await Task.WhenAll(downloadTasks);
                    foreach (var result in results)
                    {
                        ReportResult(result);
                    }
                }
}
总结:多线程虽然可以在一定程度上提升程序性能,但是使用时需要谨慎选择,如果使用不当的话会出现超预期的效果。

 

标签:www,浅谈,c#,private,https,多线程,com,cn
From: https://www.cnblogs.com/xulian1990/p/17517408.html

相关文章

  • SpringBoot elasticsearch 简单使用
    ElasticSearch是一个基于Lucene的搜索服务器,其实就是对Lucene进行封装,提供了RESTAPI的操作接口。ElasticSearch作为一个高度可拓展的开源全文搜索和分析引擎,可用于快速地对大数据进行存储,搜索和分析。ElasticSearch主要特点:分布式、高可用、异步写入、多API、面向文档。Elastic......
  • buuctf写题
    php反序列化字符逃逸easy_serialize_php拿到源码:<?php$function=@$_GET['f'];functionfilter($img){$filter_arr=array('php','flag','php5','php4','fl1g');$filter='/'.implode(�......
  • libc2.23的堆学习
    堆学习libc2.23chef*​ ——堆溢出伪造fakechunk,修改free_hook为og(libc2.23-0ubuntu11.3_amd64)检查:ida分析:主程序是一个菜单,但是有点假,只是打印了一些字符串,没有什么实际的操作,直接进入选项4。这个菜单实现了堆操作增删改查。​ add函数,有一个if判断,这限制了最多只能申......
  • git rebase合并多个commit
    一、为什么要合并commit?一般要merge到master的时候才会有这个要求,清晰明了的commit有利于团队维护。 二、什么是gitrebase?含义:rebase的意思是变基,‘re’前缀在英语里是‘再’的意思,'base':基础。命令:pick:正常选中squash:选中,会将当前commit与上一个commit合并fixup:与squ......
  • 【3分钟系列教程】仅需5步就能在mac m1安装jmeter5.5
    下载jmeter,官网的地址太慢了,我找了一个阿里云的镜像网站https://mirrors.aliyun.com/apache/jmeter/binaries/解压之后拷贝到某个安装目录cp-rDownloads/apache-jmeter-5.5software/jmeter修改成中文界面vimjmeter/bin/jmeter.properties,找到下面这两行,把#language=e......
  • Oracle将用户权限移植到另一个用户上
    问题描述:往往有些需求,A用户依赖于B用户创建,A用户想要获取B用户的权限,oracle没找到有命令可以直接继承,只能写一些语句来代替 1.查询用户下的权限有哪些SETPAGESIZE100SETLINESIZE200COLUMNownerFORMATA20COLUMNtable_nameFORMATA30COLUMNprivilegeFORMATA30......
  • C# 集合类 入门
    什么是集合类?集合类的位置在System.Collections.Generic命名空间中。在我看来,集合类和大学里《数据结构》中所学的各种结构很像。集合类中包含Queue<T>类、Stack<T>类,LinkedList<T>类,而《数据结构》中有队列、栈、双向链表。这些概念性的东西是想通的。C#中的集合类更像是一个......
  • Spectrum Random Masking for Generalization in Image-based Reinforcement Learning
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! ......
  • 2023年第四届机械工程与材料国际会议(ICMEM 2023)
    2023年第四届机械工程与材料国际会议(ICMEM2023)将于2023年11月2-4日在中国武汉召开。ICMEM2023由湖北省众科地质与环境技术服务中心主办,拟邀请国内外知名科学家、专家、学者和研究人员进行学术报告。★重要信息大会时间:2023年11月2-4日大会地点:中国-湖北-武汉截稿日期:2023年......
  • EasyCVR播放设备录像出现部分视频不能播放的原因排查与解决
    EasyCVR视频融合平台基于云边端协同架构,具有强大的数据接入、处理及分发能力。平台支持多协议接入,包括:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等,对外可分发多格式视频流,包括RTSP、RTMP、FLV、HLS、WebRTC等。有用户反馈,通过SDK接入的设备,当天的设......