委托与线程在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提高采集效率。在处理采集结果时,代码会等待所有异步采集任务完成后再进行处理,以保证异步任务全部完成。

相关文章
|
8天前
|
Java
并发编程之线程池的应用以及一些小细节的详细解析
并发编程之线程池的应用以及一些小细节的详细解析
21 0
|
10天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
10天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
7天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
28 0
|
4天前
|
缓存 Java
Java并发编程:深入理解线程池
【4月更文挑战第26天】在Java中,线程池是一种重要的并发工具,它可以有效地管理和控制线程的执行。本文将深入探讨线程池的工作原理,以及如何使用Java的Executor框架来创建和管理线程池。我们将看到线程池如何提高性能,减少资源消耗,并提供更好的线程管理。
|
5天前
|
Java
Java中的多线程编程:深入解析与实战应用
Java中的多线程编程:深入解析与实战应用
|
8天前
|
Java
Java中的并发编程:理解和应用线程池
【4月更文挑战第23天】在现代的Java应用程序中,性能和资源的有效利用已经成为了一个重要的考量因素。并发编程是提高应用程序性能的关键手段之一,而线程池则是实现高效并发的重要工具。本文将深入探讨Java中的线程池,包括其基本原理、优势、以及如何在实际开发中有效地使用线程池。我们将通过实例和代码片段,帮助读者理解线程池的概念,并学习如何在Java应用中合理地使用线程池。
|
10天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
|
10天前
|
人工智能 C# 开发者
C#编程中的图形界面设计
【4月更文挑战第21天】本文探讨了C#在GUI设计中的应用,介绍了Windows Forms、WPF和UWP等常用框架,强调了简洁界面、响应式设计和数据绑定等最佳实践。通过实际案例,展示了C#在企业应用、游戏开发和移动应用中的GUI实现。随着技术发展,C#在GUI设计的未来将趋向于跨平台、更丰富的组件和AI集成,为开发者创造更多可能性。
|
10天前
|
存储 算法 C#
C#编程与数据结构的结合
【4月更文挑战第21天】本文探讨了C#如何结合数据结构以构建高效软件,强调数据结构在C#中的重要性。C#作为面向对象的编程语言,提供内置数据结构如List、Array和Dictionary,同时也支持自定义数据结构。文章列举了C#实现数组、链表、栈、队列等基础数据结构的示例,并讨论了它们在排序、图算法和数据库访问等场景的应用。掌握C#数据结构有助于编写高性能、可维护的代码。