.NET异步方法

Task.run和threadpool.QueueUserWorkItem Task.Run 和 ThreadPool.QueueUserWorkItem 都是在 .NET 中用于执行异步任务的方法,但它们之间有一些区别。 返回值类型不同:Task.Run 返回一个 Task 对象,而 ThreadPool.QueueUserWorkItem 没有返回值。 参数不同:Task.Run 接受一个 Func<Task> 或 Action 委托,而 ThreadPool.QueueUserWorkItem 接受一个 WaitCallback 委托。 线程池的使用方式不同:Task.Run 会使用线程池中的线程来执行任务,而 ThreadPool.QueueUserWorkItem 只能使用线程池中的线程来执行任务。 异常处理不同:Task.Run 可以通过 await 关键字或 Task.Wait 方法等方式来捕获任务中的异常,而 ThreadPool.QueueUserWorkItem 没有提供类似的机制,需要在任务中自行处理异常。 综上所述,Task.Run 更加灵活,可以更好地支持异步编程模式,而 ThreadPool.QueueUserWorkItem 更适合执行简单的后台任务。在一般情况下,建议使用 Task.Run 来执行异步任务。 ...

2025年7月28日 · 4 分钟 · 1587 字

自定义事件

以下是一个使用 Python 实现自定义事件的示例代码: import threading import time class CustomEvent: def __init__(self): self.handlers = set() def add_handler(self, handler): self.handlers.add(handler) def remove_handler(self, handler): self.handlers.remove(handler) def fire(self, *args, **kwargs): for handler in self.handlers: handler(*args, **kwargs) # 创建一个自定义事件 my_event = CustomEvent() # 定义一个事件处理函数 def on_my_event(message): print('Custom event received:', message) # 添加事件处理函数到事件处理程序列表 my_event.add_handler(on_my_event) # 触发自定义事件 my_event.fire('Hello, world!') # 等待一段时间,以便查看输出结果 time.sleep(1) 在这个示例中,我们首先定义了一个名为 CustomEvent 的自定义事件类,其中包含了添加、删除和触发事件处理程序的方法。接着,我们创建了一个 my_event 实例作为自定义事件,并定义了一个名为 on_my_event 的事件处理函数。然后,我们将 on_my_event 函数添加到 my_event 实例的事件处理程序列表中。最后,我们通过调用 my_event.fire 方法触发了自定义事件,并传递了一个消息作为参数。这将导致事件处理程序被调用并输出消息。 ...

2025年7月28日 · 2 分钟 · 583 字

vs2019离线安装包制作

vs2009脱机安装 执行layout.cmd,需要网络,如果已经下载localVSlayout,可以跳过这一步 执行cert.cmd,不需要网络. 执行setup.cmd,不需要网络. 脱机安装指引>https://docs.microsoft.com/en-us/visualstudio/install/create-an-offline-installation-of-visual-studio?view=vs-2019 可以参考1,3步命令下载安装其他组件 工作负载和组件id官网地址>https://docs.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-professional?view=vs-2019 ...

2025年7月24日 · 2 分钟 · 657 字

couchdb

CouchDB是一个开源的面向文档的数据库管理系统,建立于 C++ 之上。 ui http://192.168.200.16:5984/_utils/#/_all_dbs curl http://admin:admin@192.168.200.16:5984/_utils/#/_all_dbs curl -X PUT http://admin:admin@192.168.200.16:5984/test curl -X GET http://admin:admin@192.168.200.16:5984/test curl -X DELETE http://admin:admin@192.168.200.16:5984/test curl -X PUT http://admin:admin@192.168.200.16:5984/test/"002" -d "{\"Name\":\"Raju\",\"age\":\"23\"}" curl -X GET http://admin:admin@192.168.200.16:5984/test/"002" {"_id":"002","_rev":"1-d72ed8577c9b1547dec5052cd503b359","Name":"Raju","age":"23"} curl -X PUT http://admin:admin@192.168.200.16:5984/test/"002" -d "{\"Name\":\"Raju\",\"age\":\"24\",\"_rev\":\"1-d72ed8577c9b1547dec5052cd503b359\"}" curl -X GET http://admin:admin@192.168.200.16:5984/test/"002" {"_id":"002","_rev":"2-f2716b3df54d9bbbc7d9b4eafe965354","Name":"Raju","age":"24"} curl -X GET http://admin:admin@192.168.200.16:5984/test/"003" {"_id":"003","_rev":"1-d72ed8577c9b1547dec5052cd503b359","Name":"Raju","age":"23"} curl -X DELETE http://admin:admin@192.168.200.16:5984/test/"003"?rev=1-d72ed8577c9b1547dec5052cd503b359 curl -X GET http://admin:admin@192.168.200.16:5984/test/"003" {"error":"not_found","reason":"deleted"} 查询 ### ip192d168d129d162 POST http://192.168.200.16:5984/ip192d168d129d162/_find authorization: Basic YWRtaW46YWRtaW4= Content-Type: application/json { "selector": { "datetime": { "$gte": 20220517000000000 } }, "sort":[{"datetime":"desc"}], "bookmark":"", "limit": 1000, "fields": ["dateformat","data"], "execution_stats": true }

2025年7月24日 · 1 分钟 · 114 字

github-actions

GitHub Actions是GitHub平台提供的一种持续集成和持续部署(CI/CD)工具。它允许开发者在GitHub上自动化执行各种任务,如构建、测试、部署等。 使用GitHub Actions,您可以创建一个工作流程(Workflow),该工作流程由一个或多个任务(Job)组成,每个任务可以运行在不同的操作系统和环境中。每个任务又由一个或多个步骤(Step)组成,每个步骤可以运行一条或多条命令。 ...

2025年7月24日 · 2 分钟 · 540 字

jekyll-timezone

Jekyll的时区和时间 2019-12-02 07:00:00 +0800 | 建站 | Jekyll 时区 GitHub Pages 在填写博文Front Matter里的日期时间date变量时如果不带时区字段,一律视为UTC标准时+0000时区,如果要填写其他时区的时间必须指明时区,类似这样2019-12-02 07:00:00 +0800。在_config.yml设置修改timezone变量只关乎日期时间date的显示效果,而不影响真正的时间值。下面详述: ...

2025年7月24日 · 4 分钟 · 1811 字

WaitCallback

WaitCallback 委托一般用于将方法异步执行到线程池线程上。线程池是一组可重用的线程,可以在需要时分配线程来执行工作,而不需要创建新的线程。使用线程池可以避免频繁地创建和销毁线程,从而提高应用程序的性能和可伸缩性。 通常,您可以使用 ThreadPool.QueueUserWorkItem 方法将方法异步执行到线程池线程上,并使用 WaitCallback 委托来表示要执行的方法。在这种情况下,WaitCallback 委托的参数是一个 object 类型的对象,该对象可以包含要传递给方法的数据。 ...

2025年7月24日 · 1 分钟 · 283 字

yield

在 C# 中,yield 關鍵字用於定義一個迭代器方法(Iterator Method), 這個方法可以產生一個可枚舉的序列。當迭代器方法被調用時, 它不會立即執行方法體中的程式碼,而是返回一個 IEnumerator 對象。 當使用者對這個 IEnumerator 對象調用 MoveNext() 方法時,才會執行迭代器方法中的程式碼,並返回序列中的下一個元素。 ...

2025年7月24日 · 2 分钟 · 851 字

Tuple

可以通过nuget安装 NetLegacySupport.Tuple。这是从.Net 4.5移植到.Net 2.0和3.5的Tuple类 下面是一个使用 Tuple 的简单示例: using System; class Program { static void Main(string[] args) { // 创建一个包含两个元素的 Tuple var tuple = Tuple.Create("John", 30); // 访问 Tuple 中的元素 Console.WriteLine("Name: " + tuple.Item1); Console.WriteLine("Age: " + tuple.Item2); // 创建一个包含三个元素的 Tuple var tuple2 = Tuple.Create("Mary", 25, "Female"); // 访问 Tuple 中的元素 Console.WriteLine("Name: " + tuple2.Item1); Console.WriteLine("Age: " + tuple2.Item2); Console.WriteLine("Gender: " + tuple2.Item3); } } 在上面的示例中,我们使用 Tuple.Create 方法创建了两个不同元素数量的 Tuple,并访问了其中的元素。Tuple 的元素可以通过 Item1、Item2、Item3 等属性访问,也可以使用解构语法将元素分解成多个变量。 ...

2025年7月24日 · 1 分钟 · 395 字

.NET Framework 自托管详解

.NET Framework 自托管详解 自托管(Self-Hosting)是指不依赖 IIS 等外部 Web 服务器,而是通过应用程序自身创建和管理 Web 服务器实例的方式运行 Web 应用程序。 1. HttpListener 方式 这是最基础的自托管方式,使用 .NET Framework 内置的 HttpListener 类: using System; using System.IO; using System.Net; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { // 创建 HttpListener 实例 HttpListener listener = new HttpListener(); // 添加监听的 URL 前缀 listener.Prefixes.Add("http://localhost:8080/"); // 启动监听 listener.Start(); Console.WriteLine("服务器启动,监听 http://localhost:8080/"); // 处理请求循环 while (true) { // 等待请求 HttpListenerContext context = await listener.GetContextAsync(); // 处理请求 await ProcessRequest(context); } } static async Task ProcessRequest(HttpListenerContext context) { HttpListenerResponse response = context.Response; // 设置响应内容 string responseString = "<html><body><h1>Hello from Self-Hosted Server!</h1></body></html>"; byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); // 设置响应头 response.ContentType = "text/html"; response.ContentLength64 = buffer.Length; // 写入响应 using (Stream output = response.OutputStream) { await output.WriteAsync(buffer, 0, buffer.Length); } // 关闭响应 response.Close(); } } 2. ASP.NET Web API 自托管 使用 Microsoft.AspNet.WebApi.SelfHost 包可以创建更完整的 Web API 服务: ...

2025年7月24日 · 2 分钟 · 951 字