委托与线程在C#编程中的应用及选择

简介: 委托是一种表示对具有特定参数列表和返回类型的方法的引用的类型。可以使用委托将方法作为参数传递给其他方法,或者异步地调用方法。线程是一个执行单元,它可以与进程中的其他线程并发运行。可以使用线程来同时执行多个任务,或者并行化计算密集型的工作。委托和线程之间的区别在于,委托是一种引用方法的方式,而线程是一种执行方法的方式。可以使用委托在不同的线程上调用方法,要么使用委托的 BeginInvoke 和 EndInvoke 方法,要么使用 ThreadPool 或 Task 类。

显示器11.jpg

委托是一种表示对具有特定参数列表和返回类型的方法的引用的类型。可以使用委托将方法作为参数传递给其他方法,或者异步地调用方法

线程是一个执行单元,它可以与进程中的其他线程并发运行。可以使用线程来同时执行多个任务,或者并行化计算密集型的工作

委托和线程之间的区别在于,委托是一种引用方法的方式,而线程是一种执行方法的方式。可以使用委托在不同的线程上调用方法,要么使用委托的 BeginInvoke 和 EndInvoke 方法,要么使用 ThreadPool 或 Task 类

在爬虫程序中,哪一种更合适取决于具体的设计和需求。一般来说,使用委托与 ThreadPool 或 Task 比创建和管理自己的线程更高效和方便。但是,如果想要更多地控制线程的优先级、身份或生命周期,可能需要使用线程。也可能想要考虑使用 C# 5 或更高版本中的 async/await 关键字,它们使异步编程变得更容易和清晰。例如采集每天采集TOP5的新闻网站,归纳整理当天的热点新闻为案例,代码如下:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Net;
usingSystem.Net.Http;
usingSystem.Threading.Tasks;
usingHtmlAgilityPack;
namespaceAsyncWebCrawler{
classProgram    {
staticasyncTaskMain(string[] args)
        {
varnewsSites=newList<string>()
            {
"https://www.bbc.com/news",
"https://www.cnn.com/",
"https://www.nytimes.com/",
"https://www.theguardian.com/international",
"https://www.aljazeera.com/",
            };
varhttpClientHandler=newHttpClientHandler            {
// 亿牛云 动态转发代理IP// 爬虫加强版 IP和端口                 stringproxyHost="www.16yun.cn";
stringproxyPort="31111";
// 爬虫加强版 代理验证信息stringproxyUser="16YUN";
stringproxyPass="16IP";
// 设置代理服务器               Proxy=newWebProxy(string.Format("{0}:{1}", proxyHost, proxyPort), true),
UseProxy=true,
Credentials=newNetworkCredential(proxyUser, proxyPass)
            };
varhttpClient=newHttpClient(httpClientHandler);
vartasks=newList<Task<NewsSite>>();
// 开始异步采集foreach (varnewsSiteinnewsSites)
            {
tasks.Add(CollectNewsSiteAsync(httpClient, newsSite));
            }
// 等待所有异步采集任务完成varresults=awaitTask.WhenAll(tasks);
// 处理采集结果,整理热点标题varhotTopics=newList<string>();
foreach (varresultinresults)
            {
hotTopics.AddRange(result.GetHotTopics());
            }
// 输出结果Console.WriteLine("Hot Topics:");
foreach (varhotTopicinhotTopics)
            {
Console.WriteLine(hotTopic);
            }
        }
// 异步采集新闻网站首页staticasyncTask<NewsSite>CollectNewsSiteAsync(HttpClienthttpClient, stringnewsSite)
        {
varhtml=awaithttpClient.GetStringAsync(newsSite);
vardocument=newHtmlDocument();
document.LoadHtml(html);
returnnewNewsSite(newsSite, document);
        }
// 新闻网站类classNewsSite        {
privatestring_url;
privateHtmlDocument_document;
publicNewsSite(stringurl, HtmlDocumentdocument)
            {
_url=url;
_document=document;
            }
// 获取热点标题publicList<string>GetHotTopics()
            {
varhotTopics=newList<string>();
varheadlineNodes=_document.DocumentNode.SelectNodes("//h2[contains(@class,'headline')]");
if (headlineNodes!=null)
                {
foreach (varheadlineNodeinheadlineNodes)
                    {
hotTopics.Add($"{_url}: {headlineNode.InnerText}");
                    }
                }
returnhotTopics;
            }
        }
    }
}

该示例代码会采集五个新闻网站的首页,并整理当天的热点标题。采集过程是异步的,使用 async/await 关键字实现,同时使用动态转发代理IP提高采集效率。在处理采集结果时,代码会等待所有异步采集任务完成后再进行处理,以保证异步任务全部完成。

相关文章
|
10月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
444 83
|
7月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
294 6
|
12月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
423 0
|
8月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
363 19
|
8月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
527 16
|
7月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
708 0
|
9月前
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
1956 0
|
Java
线程池是什么?线程池在实际工作中的应用
总的来说,线程池是一种有效的多线程处理方式,它可以提高系统的性能和稳定性。在实际工作中,我们需要根据任务的特性和系统的硬件能力来合理设置线程池的大小,以达到最佳的效果。
321 18
|
存储 监控 算法
基于 C# 时间轮算法的控制局域网上网时间与实践应用
在数字化办公与教育环境中,局域网作为内部网络通信的核心基础设施,其精细化管理水平直接影响网络资源的合理配置与使用效能。对局域网用户上网时间的有效管控,已成为企业、教育机构等组织的重要管理需求。这一需求不仅旨在提升员工工作效率、规范学生网络使用行为,更是优化网络带宽资源分配的关键举措。时间轮算法作为一种经典的定时任务管理机制,在局域网用户上网时间管控场景中展现出显著的技术优势。本文将系统阐述时间轮算法的核心原理,并基于 C# 编程语言提供具体实现方案,以期深入剖析该算法在局域网管理中的应用逻辑与实践价值。
292 5
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
288 26