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 字

winform程序防止多开

Winform启动的时候,检测是否存在同样的进程名,防止程序多开; static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { string processName = Process.GetCurrentProcess().ProcessName; Process[] processes = Process.GetProcessesByName(processName); //如果该数组长度大于1,说明多次运行 if (processes.Length > 1) { MessageBox.Show("程序已运行,不能再次打开!"); Environment.Exit(1); } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } 利用Mutex互斥对象防止程序多开; static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { bool isAppRunning = false; Mutex mutex = new Mutex(true, System.Diagnostics.Process.GetCurrentProcess().ProcessName, out isAppRunning); if (!isAppRunning) { MessageBox.Show("程序已运行,不能再次打开!"); Environment.Exit(1); } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } }

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

.NET的版本

.NET Framework 是微软在 2002 年推出的一个软件开发框架,它提供了一组类库和运行时环境,可以用来开发 Windows 应用程序、Web 应用程序、服务端应用程序等。下面是 .NET Framework 的版本列表: .NET Framework 1.0 .NET Framework 1.1 .NET Framework 2.0 .NET Framework 3.0 .NET Framework 3.5 .NET Framework 4.0 .NET Framework 4.5 .NET Framework 4.5.1 .NET Framework 4.5.2 .NET Framework 4.6 .NET Framework 4.6.1 .NET Framework 4.6.2 .NET Framework 4.7 .NET Framework 4.7.1 .NET Framework 4.7.2 .NET Framework 4.8 除了 .NET Framework,微软还推出了 .NET Core 和 .NET 5,它们是跨平台的 .NET 实现,可以在 Windows、Linux 和 macOS 上运行。下面是 .NET Core 和 .NET 5 的版本列表: ...

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

程序进程间通讯的方法

在编程中,有几种常见的方法可以实现程序进程间的通信,包括: 管道(Pipes):管道是一种在两个进程之间传递数据的通信机制。它可以是匿名管道(在同一台计算机上的进程之间使用)或命名管道(在网络上的不同计算机之间使用)。 套接字(Sockets):套接字是一种通过网络在不同计算机上的进程之间进行通信的方法。它可以使用TCP协议(面向连接)或UDP协议(无连接)。 共享内存(Shared Memory):共享内存是一种在不同进程之间共享数据的机制。它允许多个进程访问同一块内存区域,从而实现数据的快速交换。 消息队列(Message Queues):消息队列是一种通过在进程之间传递消息来实现通信的机制。它可以是基于内存的消息队列或持久化的消息队列。 文件(Files):进程可以通过读写共享文件来进行通信。一个进程可以将数据写入文件,而另一个进程可以读取该文件以获取数据。 远程过程调用(Remote Procedure Call,RPC):RPC允许一个进程调用另一个进程中的函数或方法,就像调用本地函数一样。它可以在同一台计算机上的不同进程之间或在网络上的不同计算机之间进行通信。 ...

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

C#中异步调用函数的方法有哪些

在 C# 中,有几种方法可以进行异步调用函数: 使用 async/await 关键字:async/await 是 C# 中用于编写异步代码的关键字组合。你可以将需要异步执行的函数标记为 async,然后在其中使用 await 关键字来等待异步操作完成。这样可以使函数在异步操作执行期间不阻塞,并在操作完成后继续执行。例如: public async Task MyAsyncMethod() { // 异步操作 await Task.Delay(1000); // 异步操作完成后的代码 Console.WriteLine("异步操作完成"); } 使用 Task.Run 方法:Task.Run 方法可以将一个方法或代码块包装成一个 Task 对象,并在后台线程上执行。这样可以实现异步调用函数的效果。例如: public void MyMethod() { // 异步调用函数 Task.Run(async () => { // 异步操作 await Task.Delay(1000); // 异步操作完成后的代码 Console.WriteLine("异步操作完成"); }); // 继续执行其他代码 Console.WriteLine("异步调用进行中"); } 使用委托和回调函数:你可以定义一个异步委托,并使用回调函数来处理异步操作完成后的结果。例如: public delegate void MyAsyncDelegate(); public void MyMethod() { // 创建异步委托实例 MyAsyncDelegate asyncDelegate = new MyAsyncDelegate(MyAsyncMethod); // 异步调用委托 asyncDelegate.BeginInvoke(MyAsyncCallback, null); // 继续执行其他代码 Console.WriteLine("异步调用进行中"); } public void MyAsyncMethod() { // 异步操作 Thread.Sleep(1000); } public void MyAsyncCallback(IAsyncResult result) { // 异步操作完成后的代码 Console.WriteLine("异步操作完成"); } 这些是在 C# 中进行异步调用函数的几种常见方法。你可以根据具体的需求选择适合的方法来实现异步操作。

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

关于浏览器css&js缓存

关于浏览器css,js缓存 ctrl + F5 强制刷新 如果刷新浏览器无法清除js的缓存,就可以尝试在js文件后面加上版本号,例如:js.js?v= 在html头部加上no-cache Cache-Control Cache-Control是HTTP协议中的一个响应头部字段,用于控制缓存的行为。它指示客户端和中间缓存服务器如何缓存和重新验证响应。 ...

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

glob表达式

Glob 表达式是一种用于匹配文件路径或名称的模式字符串。它在很多编程语言和操作系统中都被广泛使用,用于文件系统操作、文件搜索和筛选等场景。 Glob 表达式使用特定的通配符字符来表示匹配规则,常见的通配符包括: *:匹配任意数量的字符(包括零个字符)。 ?:匹配单个字符。 [...]:匹配方括号中指定的字符范围中的任意一个字符。例如,[abc] 匹配 a、b 或 c。 [!...]:匹配不在方括号中指定的字符范围中的任意一个字符。例如,[!abc] 匹配除了 a、b 和 c 之外的任意字符。 以下是一些示例: ...

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