中国铁路建设投资公司官方网站国内做网站哪家公司好

张小明 2025/12/29 2:14:06
中国铁路建设投资公司官方网站,国内做网站哪家公司好,想做苗木生意网站怎么怎么做,找效果图去哪个网站Random类Random 类用于生成伪随机数#xff0c;位于 System 命名空间。它的核心机制是基于一个种子值 (seed)#xff0c;通过算法生成看似随机的数列。相同种子会生成相同的随机数序列#xff0c;这在需要可重现的随机场景中很有用。//1.1创建一个随机数队列,并指定种子 Ran…Random类Random类用于生成伪随机数位于System命名空间。它的核心机制是基于一个种子值 (seed)通过算法生成看似随机的数列。相同种子会生成相同的随机数序列这在需要可重现的随机场景中很有用。//1.1创建一个随机数队列,并指定种子 Random random new Random(10);//指定种子为10 ​ //1.2获取随机数 Console.WriteLine(random.Next()); ​ //Next(min,max) 会生成一个在min和max之间的随机整数,但是包括min不包括max Console.WriteLine(random.Next(10,21)); ​DateTime类DateTime表示特定的时间点精度为 100 纳秒存储为自 0001 年 1 月 1 日以来的 ticks 数。它是值类型struct不可变。DateTime now DateTime.Now; //现在时间 Console.WriteLine(now.Year); // 年 Console.WriteLine(now.Month); // 月 Console.WriteLine(now.DayOfWeek); // 星期几枚举 ​ DateTime tomorrow DateTime.Now.AddDays(1); //**比较与差值** DateTime a DateTime.Now; DateTime b a.AddHours(1); TimeSpan diff b - a; Console.WriteLine(diff.TotalHours); // 输出 1 //时区处理 DateTime local DateTime.Now; DateTime utc local.ToUniversalTime(); // 转换为 UTC ​ //字符串与 DateTime 互转 DateTime.Parse(2023-10-01); // 自动解析 DateTime.ParseExact(20231001, yyyyMMdd, null); // 指定格式 ​ DateTime now DateTime.Now; Console.WriteLine(now.ToString(yyyy-MM-dd)); // 输出2023-10-01 Console.WriteLine(now.ToString(HH:mm:ss)); // 输出14:30:00 ​String类String是引用类型但具有不可变性immutable所有操作都会返回新字符串。它本质是char数组的封装。string s1 abc; string s2 吴亦凡; string s3 123; ​ // string s4 s1 s2 s3; ​ //1.Concat() 拼接字符串 string s4 string.Concat(s1, s2, s3); Console.WriteLine(s4); //2.Contains() 判断参数字符串 是否出现在源字符串中 //出现 返回true 不出现返回 false bool b wuyifan.Contains(吴); Console.WriteLine(); //3.CopyTo() 从字符串中复制一部分字符 放到一个字符数组中 //参数1:被复制的字符串开始的索引 //参数2:复制到的数组 //参数3:从数组中第几个索引位置开始放 //参数4:复制的个数 s2.CopyTo(1, chars, 0, 2); //4.ToUpper() 将小写字母 转成大写字母 Console.WriteLine(s5.ToUpper());//ABDDD //5.ToLower() 将大写字母 转成小写字母 Console.WriteLine(s5.ToLower());//abddd //7.Replace() 替换字符方法名称说明示例代码执行结果Length属性获取字符串长度string s Hello; int len s.Length;5ToUpper()转换为大写字母string s Hello; string res s.ToUpper();HELLOToLower()转换为小写字母string s HELLO; string res s.ToLower();helloTrim()移除首尾空白字符string s Hello ; string res s.Trim();HelloTrimStart()移除开头空白字符string s Hello; string res s.TrimStart();HelloTrimEnd()移除结尾空白字符string s Hello ; string res s.TrimEnd();HelloContains(string)判断是否包含指定子串string s Hello World; bool res s.Contains(World);trueStartsWith(string)判断是否以指定子串开头string s Hello; bool res s.StartsWith(He);trueEndsWith(string)判断是否以指定子串结尾string s Hello; bool res s.EndsWith(llo);trueIndexOf(char)查找字符首次出现的索引-1 表示未找到string s Hello; int res s.IndexOf(l);2LastIndexOf(char)查找字符最后出现的索引string s Hello; int res s.LastIndexOf(l);3Substring(int, int)从指定索引截取指定长度的子串string s Hello World; string res s.Substring(6, 5);WorldReplace(string, string)替换指定子串为新字符串string s Hello; string res s.Replace(l, x);HexxoSplit(char[])按指定字符分割为字符串数组string s Apple,Banana,Orange; string[] res s.Split(,);[Apple, Banana, Orange]Join(string, string[])将字符串数组拼接为一个字符串string[] arr { A, B, C }; string res string.Join(-, arr);A-B-CIsNullOrEmpty(string)判断字符串是否为null或空串bool res1 string.IsNullOrEmpty(); bool res2 string.IsNullOrEmpty(null);true, trueIsNullOrWhiteSpace(string)判断是否为null、空串或仅含空白bool res string.IsNullOrWhiteSpace( );trueInsert(int, string)在指定索引插入子串string s Hello; string res s.Insert(5, World);Hello WorldRemove(int, int)从指定索引移除指定长度的字符string s Hello World; string res s.Remove(5, 1);I/O 类System.IO 命名空间文件存储在磁盘中带有指定名称和路径的数据集合。流Stream文件读写时的字节序列分为输入流从文件读取数据读操作输出流向文件写入数据写操作// 读文件 using (FileStream fs new FileStream(test.txt, FileMode.Open, FileAccess.Read)) { byte[] buffer new byte[1024]; int length fs.Read(buffer, 0, buffer.Length); // 读取字节 string content Encoding.UTF8.GetString(buffer, 0, length); // 解码 } ​ // 写文件 using (FileStream fs new FileStream(test.txt, FileMode.Create, FileAccess.Write)) { byte[] data Encoding.UTF8.GetBytes(Hello); // 编码 fs.Write(data, 0, data.Length); // 写入字节 } ​ // 读文件 using (FileStream fs new FileStream(test.txt, FileMode.Open, FileAccess.Read)) { byte[] buffer new byte[1024]; int length fs.Read(buffer, 0, buffer.Length); // 读取字节 string content Encoding.UTF8.GetString(buffer, 0, length); // 解码 } ​ // 写文件 using (FileStream fs new FileStream(test.txt, FileMode.Create, FileAccess.Write)) { byte[] data Encoding.UTF8.GetBytes(Hello); // 编码 fs.Write(data, 0, data.Length); // 写入字节 } ​ //BufferedStream带缓冲区的流 using (FileStream fs new FileStream(bigfile.txt, FileMode.Create)) using (BufferedStream bs new BufferedStream(fs)) { byte[] data Encoding.UTF8.GetBytes(大量数据...); bs.Write(data, 0, data.Length); // 先写入缓冲区满了自动刷到文件 bs.Flush(); // 手动刷新缓冲区确保数据写入文件 }File 类方法作用Create(string path)创建文件返回FileStreamDelete(string path)删除文件Move(string src, string dest)移动文件Copy(string src, string dest)复制文件WriteAllText(string path, string content)写入字符串覆盖原内容ReadAllText(string path)读取所有内容为字符串WriteAllLines(string path, string[] lines)按行写入字符串数组// 定义测试文件路径相对路径会创建在程序运行目录 string filePath test_file.txt; string copyPath test_file_copy.txt; // 复制目标路径 string movePath moved_test_file.txt; // 移动目标路径 ​ // 1. 创建文件并写入内容覆盖式写入 // WriteAllText若文件不存在则创建存在则覆盖原有内容 string content 这是第一行内容\n这是第二行内容; File.WriteAllText(filePath, content); Console.WriteLine($1. 已创建文件并写入内容{filePath}); ​ // 2. 追加内容到文件 // AppendAllText在文件末尾添加内容文件不存在则创建 string appendContent \n这是追加的内容; File.AppendAllText(filePath, appendContent); Console.WriteLine(2. 已向文件追加内容); ​ // 3. 读取文件所有内容字符串形式 string allText File.ReadAllText(filePath); Console.WriteLine(\n3. 读取文件所有内容); Console.WriteLine(allText); ​ // 4. 按行读取文件内容 string[] lines File.ReadAllLines(filePath); Console.WriteLine(\n4. 按行读取文件内容); for (int i 0; i lines.Length; i) { Console.WriteLine($第{i1}行{lines[i]}); } ​ // 5. 以字节形式读取文件适用于二进制文件 byte[] bytes File.ReadAllBytes(filePath); Console.WriteLine($\n5. 文件字节长度{bytes.Length} 字节); ​ // 6. 复制文件 // 第三个参数为true表示允许覆盖已存在的目标文件 File.Copy(filePath, copyPath, overwrite: true); Console.WriteLine($\n6. 已复制文件到{copyPath}); ​ // 7. 移动文件剪切 File.Move(copyPath, movePath); Console.WriteLine($7. 已移动文件到{movePath}); ​ // 8. 检查文件是否存在 bool exists File.Exists(filePath); Console.WriteLine($\n8. 文件 {filePath} 是否存在{exists}); ​ // 9. 删除文件 File.Delete(movePath); Console.WriteLine($9. 已删除文件{movePath});StreamReader / StreamWriter文本文件操作// 写文本文件 using (StreamWriter sw new StreamWriter(log.txt)) { sw.WriteLine(第一行); sw.WriteLine(第二行); } ​ // 读文本文件 using (StreamReader sr new StreamReader(log.txt)) { string line; while ((line sr.ReadLine()) ! null) { // 逐行读取 Console.WriteLine(line); } }DriveInfo驱动器信息AvailableFreeSpace可用空间字节DriveFormat文件系统如 NTFSDriveType驱动器类型固定 / 移动 / CD-ROM 等IsReady驱动器是否就绪DriveInfo cDrive new DriveInfo(C:); if (cDrive.IsReady) { Console.WriteLine($可用空间{cDrive.AvailableFreeSpace / 1024 / 1024} MB); Console.WriteLine($文件系统{cDrive.DriveFormat}); }文件属性操作File / FileInfoFileInfo file new FileInfo(test.txt); file.Attributes FileAttributes.ReadOnly | FileAttributes.Hidden; // 设置只读隐藏 Console.WriteLine($是否只读{file.IsReadOnly}); Console.WriteLine($创建时间{file.CreationTime});Path 类处理路径字符串跨平台兼容。GetDirectoryName(path)获取目录GetExtension(path)获取扩展名Combine(path1, path2)拼接路径GetFullPath(relativePath)获取绝对路径Environment 类提供系统环境信息。CurrentDirectory当前工作目录GetFolderPath(SpecialFolder)获取特殊文件夹路径如桌面、临时目录目录操作Directory / DirectoryInfoDirectory静态类适合单次目录操作。DirectoryInfo非静态类适合多次操作同一目录。常用方法CreateDirectory(path)创建目录含多级Delete(path, recursive)删除目录recursivetrue删除非空目录GetFiles(path)获取目录下所有文件GetDirectories(path)获取子目录递归遍历目录示例static void TraverseDir(string path) { foreach (string dir in Directory.GetDirectories(path)) { Console.WriteLine($目录{dir}); foreach (string file in Directory.GetFiles(dir)) { Console.WriteLine($文件{file}); } TraverseDir(dir); // 递归遍历子目录 } }C#EncodingSystem.Text.Encoding是 C# 中处理字符编码与转换的核心类核心作用是建立字符串字符序列与字节数组二进制数据之间的转换桥梁实现不同编码格式如 UTF-8、ASCII 等的映射规则解决 “人类可识别字符” 与 “计算机存储的二进制” 之间的转换问题1. 网络通信确保跨系统一致性// 发送方字符串→UTF8字节 string sendText Hello世界; byte[] sendBytes Encoding.UTF8.GetBytes(sendText); // 接收方UTF8字节→字符串 byte[] receiveBytes ...; // 从网络接收的字节 string receiveText Encoding.UTF8.GetString(receiveBytes);2. 文件读写匹配文件编码// 写入UTF8编码文件无BOM string content 中文内容; byte[] fileBytes Encoding.UTF8.GetBytes(content); File.WriteAllBytes(file.txt, fileBytes); // 读取时用相同编码 byte[] readBytes File.ReadAllBytes(file.txt); string readContent Encoding.UTF8.GetString(readBytes);3. 多编码转换如 GBK→UTF8// 假设bytes是GBK编码的字节 byte[] gbkBytes ...; // 步骤1用GBK解码为字符串 string text Encoding.GetEncoding(GBK).GetString(gbkBytes); // 步骤2用UTF8重新编码为字节 byte[] utf8Bytes Encoding.UTF8.GetBytes(text);JSON 序列化序列化将对象状态转换为可存储如文件或可传输如网络的格式二进制、XML、JSON 等的过程。反序列化将序列化后的格式如二进制流、JSON 文本还原为对象的过程。JSONJavaScript Object Notation是一种轻量级文本格式易读易写跨平台兼容性强支持多语言是目前最常用的序列化格式之一。第三方Newtonsoft.Json推荐使用步骤安装库项目右键→“管理 NuGet 程序包”→搜索 “Newtonsoft.Json”→安装引入命名空间using Newtonsoft.Json;序列化调用JsonConvert.SerializeObject(对象)生成 JSON 字符串写入文件反序列化读取 JSON 字符串调用JsonConvert.DeserializeObject类型(字符串)还原对象。示例代码using Newtonsoft.Json; // 1. 定义普通类无需任何特性 public class People { public string Name { get; set; } public int Age { get; set; } public string Sex { get; set; } public string Birth { get; set; } } // 2. 序列化 public void JsonSerialize_Newtonsoft() { People people new People() { Name 吴亦凡, Age 18, Sex 男, Birth 2005-01-01 }; // 转换对象为JSON字符串 string jsonStr JsonConvert.SerializeObject(people); // 写入文件 File.WriteAllText(people.json, jsonStr); } // 3. 反序列化 public void JsonDeserialize_Newtonsoft() { // 读取JSON字符串 string jsonStr File.ReadAllText(people.json); // 转换为对象 People people JsonConvert.DeserializeObjectPeople(jsonStr); Console.WriteLine($姓名{people.Name}年龄{people.Age}); }CSV 文件读写输入示例代码using System; using System.Collections.Generic; using System.IO; // 定义数据模型 public class Student { public string Name { get; set; } public int Age { get; set; } public string Gender { get; set; } } // 写入CSV文件 public void WriteCsv() { // 准备数据 ListStudent students new ListStudent { new Student { Name 小明, Age 20, Gender 男 }, new Student { Name 小红, Age 18, Gender 女 }, new Student { Name Doe, John, Age 22, Gender 男 } // 包含逗号的特殊字段 }; // 定义CSV文件路径 string filePath students.csv; // 写入文件 using (StreamWriter sw new StreamWriter(filePath, false, System.Text.Encoding.UTF8)) { // 写入表头 sw.WriteLine(姓名,年龄,性别); // 写入数据行 foreach (var student in students) { // 处理包含逗号的字段用双引号包裹 string name student.Name.Contains(,) ? $\{student.Name}\ : student.Name; // 拼接行字段用逗号分隔 string line ${name},{student.Age},{student.Gender}; sw.WriteLine(line); } } Console.WriteLine(CSV文件写入完成); }生成的students.csv内容姓名,年龄,性别 小明,20,男 小红,18,女 Doe, John,22,男 # 特殊字段被双引号包裹输出示例代码// 读取CSV文件并转换为对象列表 public ListStudent ReadCsv() { ListStudent students new ListStudent(); string filePath students.csv; using (StreamReader sr new StreamReader(filePath, System.Text.Encoding.UTF8)) { // 读取表头跳过或可用于验证列名 string header sr.ReadLine(); // 读取数据行 string line; while ((line sr.ReadLine()) ! null) { // 处理带双引号的字段简单处理移除引号 line line.Replace(\, ); // 按逗号分割字段 string[] fields line.Split(,); // 验证字段数量确保与表头对应 if (fields.Length ! 3) { Console.WriteLine($跳过无效行{line}); continue; } // 转换为Student对象 students.Add(new Student { Name fields[0], Age int.Parse(fields[1]), // 字符串→整数 Gender fields[2] }); } } return students; } // 使用示例 var studentList ReadCsv(); foreach (var s in studentList) { Console.WriteLine($姓名{s.Name}年龄{s.Age}性别{s.Gender}); }输出结果姓名小明年龄20性别男 姓名小红年龄18性别女 姓名Doe, John年龄22性别男 # 正确解析带逗号的字段INI 文件操作INI 文件是一种轻量级的配置文件格式主要用于 Windows 应用程序存储配置信息如窗口设置、数据库连接、设备参数等。它以文本形式存在结构简单易于人工编辑和维护适用于不需要复杂数据类型或层级结构的场景。1. 基本结构[节名] ; 节用方括号包裹区分不同配置组 键1值1 ; 键值对键与值用等号连接 键2值2 ... [另一节名] ; 支持多个节多层级节 键A值A 键B值B2. 示例[Database] ; 数据库配置节 Server127.0.0.1 ; 数据库服务器地址 Port3306 ; 端口号 Usernameroot ; 用户名 Password123456 ; 密码 [Logging] ; 日志配置节 LevelINFO ; 日志级别 File/var/log/myapp.log ; 日志路径 [相机1] ; 设备配置节支持中文节名 曝光50 ; 曝光参数 亮度100 ; 亮度参数 相机ip192.168.1.100 ; IP地址添加必要引用需引用System.Configuration命名空间用于读取App.config配置若项目中未包含需手动添加 右键项目→“添加”→“引用”→勾选 “System.Configuration”。工具类完整代码using System; using System.Collections.Specialized; using System.Configuration; using System.Text; using System.Runtime.InteropServices; internal class FileIni { // 从App.config中读取INI文件路径并添加空引用检查 private static readonly NameValueCollection iniSettings ConfigurationManager.GetSection(IniFileSettings) as NameValueCollection; private static readonly string filePath GetIniFilePath(); // 获取INI文件路径并处理可能的空值 private static string GetIniFilePath() { if (iniSettings null) { throw new ConfigurationErrorsException(未找到IniFileSettings配置节请检查App.config); } string path iniSettings[FilePath]; if (string.IsNullOrEmpty(path)) { throw new ConfigurationErrorsException(IniFileSettings配置节中未设置有效的FilePath); } return path; } // 导入kernel32.dll的宽字符版本函数支持Unicode/UTF-16 [DllImport(kernel32.dll, CharSet CharSet.Unicode, SetLastError true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool WritePrivateProfileStringW( string lpAppName, // 节名 string lpKeyName, // 键名 string lpString, // 值UTF-16 string lpFileName // INI文件路径 ); [DllImport(kernel32.dll, CharSet CharSet.Unicode)] private static extern uint GetPrivateProfileStringW( string lpAppName, // 节名 string lpKeyName, // 键名 string lpDefault, // 默认值 StringBuilder lpReturnedString, // 存储结果的字符串构建器 uint nSize, // 结果缓冲区大小 string lpFileName // INI文件路径 ); /// summary /// 向INI文件写入UTF-8编码的键值对 /// /summary public static void Write(string section, string key, string value) { if (string.IsNullOrEmpty(section)) throw new ArgumentNullException(nameof(section)); if (string.IsNullOrEmpty(key)) throw new ArgumentNullException(nameof(key)); // 将UTF-8字符串转换为API所需的UTF-16 WritePrivateProfileStringW(section, key, value, filePath); } /// summary /// 从INI文件读取UTF-8编码的键值 /// /summary public static string Read(string section, string key) { if (string.IsNullOrEmpty(section)) throw new ArgumentNullException(nameof(section)); if (string.IsNullOrEmpty(key)) throw new ArgumentNullException(nameof(key)); StringBuilder sb new StringBuilder(1024); // 增大缓冲区 GetPrivateProfileStringW(section, key, , sb, (uint)sb.Capacity, filePath); // 结果已经是UTF-16直接返回.NET内部字符串为UTF-16 return sb.ToString(); } /// summary /// 读取指定节的所有键值对 /// /summary public static NameValueCollection ReadSection(string section) { if (string.IsNullOrEmpty(section)) throw new ArgumentNullException(nameof(section)); // 先获取所有键名 StringBuilder keysSb new StringBuilder(4096); GetPrivateProfileStringW(section, null, , keysSb, (uint)keysSb.Capacity, filePath); NameValueCollection result new NameValueCollection(); string[] keys keysSb.ToString().Split(new[] { \0 }, StringSplitOptions.RemoveEmptyEntries); foreach (string key in keys) { result.Add(key, Read(section, key)); } return result; } }使用工具类操作 INI 文件1写入配置// 向[相机1]节写入曝光和亮度 FileIni.Write(相机1, 曝光, 50); FileIni.Write(相机1, 亮度, 100); // 向[Database]节写入Server FileIni.Write(Database, Server, 192.168.1.1);2读取配置// 读取[相机1]节的曝光值 string exposure FileIni.Read(相机1, 曝光); // 返回50 // 读取[Database]节的Server值 string dbServer FileIni.Read(Database, Server); // 返回192.168.1.1 // 转换数据类型因INI值均为字符串 int exposureValue int.Parse(exposure); // 转换为整数50C# 反射Reflection本质程序运行时动态查看、操作自身或其他程序集元数据类、方法、属性、字段等类型信息的机制基于程序集中存储的元数据实现。// 加载指定路径的程序集 Assembly assembly Assembly.LoadFile(F:\libs\ClassLibrary1.dll); Type studentType assembly.GetType(_02_反射.Student); // 从程序集获取 object student assembly.CreateInstance(_02_反射.Student); // 无参构造 FieldInfo idField studentType.GetField(myId); // 获取公开字段 PropertyInfo nameProp studentType.GetProperty(Name);//获取属性 MethodInfo method studentType.GetMethod(Method2);//获取方法 method.Invoke(student, new object[] { 参数1, 参数2 }); // 调用方法记得转换类型 textBox2.Text encryptMethod.Invoke(instance, new object[] { textBox1.Text }) as string; //赋值给对应控件重要反射 API 汇总API作用返回类型typeof(类型)编译时获取类型信息Type实例.GetType()运行时通过实例获取类型信息TypeAssembly.Load(名称)加载程序集基于程序集名称AssemblyAssembly.LoadFile(路径)加载指定路径的程序集AssemblyType.GetField(名称)获取字段信息FieldInfoType.GetProperty(名称)获取属性信息PropertyInfoType.GetMethod(名称)获取方法信息MethodInfoType.GetConstructor()获取构造函数信息ConstructorInfoFieldInfo.SetValue()设置字段值voidPropertyInfo.GetValue()获取属性值objectMethodInfo.Invoke()调用方法objectType.GetCustomAttribute()获取类型上的特性特性类型实例C# 特性AttributeC#单例模式设计模式是解决软件开发特定问题的成熟解决方案核心目标是通过规范化的设计思路实现代码的高内聚模块专注单一功能和低耦合减少模块间依赖从而提升代码的可重用性、可维护性和灵活性。单例模式确保一个类只有一个实例并提供一个全局访问点。多线程//线程创建 // 直接传入方法推荐最简洁 Thread thread4 new Thread(ThreadFun1); //直接嵌入匿名方法推荐适合简单逻辑 Thread thread5 new Thread(() Console.WriteLine(分线程5)); //传递参数 Thread threadC new Thread(ThreadFun2); threadC.Start(参数C); // 最简洁的传参方式 Thread threadC new Thread(ThreadFun2);threadC.Start(参数C); // 最简洁的传参方式 //线程状态流转过程 Thread thread new Thread(() { Thread.Sleep(1000); // 触发WaitSleepJoin状态 }); Console.WriteLine(thread.ThreadState); // Unstarted创建后未启动 thread.Start(); Console.WriteLine(thread.ThreadState); // 可能为Running或WaitSleepJoin thread.Join(); Console.WriteLine(thread.ThreadState); // Stopped执行完毕线程池ThreadPool线程池ThreadPool是.NET Framework 2.0 引入的池化技术实现核心思想是预先创建一定数量的线程并维护在 “池” 中当程序需要使用线程时直接从池中获取使用完毕后线程不销毁而是放回池中等待复用由公共语言运行时CLR和垃圾回收器GC自动管理线程的生命周期。// 直接嵌入匿名方法无需单独定义回调 ThreadPool.QueueUserWorkItem(state { string msg state as string; Console.WriteLine($匿名方法执行{msg}线程ID{Thread.CurrentThread.ManagedThreadId}); }, Hello ThreadPool);Task 任务Task 是.NET 4.0 推出的任务类基于线程池封装是对线程池功能的增强与扩展。相比 Thread 和 ThreadPoolTask 提供了更丰富的控制能力如任务取消、延续、等待、超时管理等且 API 更简洁是.NET 多线程编程的推荐方案。//无返回值任务 // 方式1Task.Run推荐直接执行任务 Task task1 Task.Run(() { Console.WriteLine(Task1执行中...); Thread.Sleep(1000); // 模拟任务耗时 }); //有返回值任务 // 方式1Task.RunTResult Taskint taskWithResult Task.Run(() { Console.WriteLine(计算中...); Thread.Sleep(1000); return 100 200; // 返回结果int类型 }); // 后续可通过taskWithResult.Result获取结果 //任务取消CancellationTokenSource // 1. 创建取消源 CancellationTokenSource cts new CancellationTokenSource(); CancellationToken token cts.Token; // 2. 启动一个可取消的任务 Task task Task.Run(() { for (int i 0; i 10; i) { // 检查是否收到取消信号协作式取消的核心 if (token.IsCancellationRequested) { Console.WriteLine(任务已取消); return; // 收到信号后退出任务 } Console.WriteLine($任务执行中{i}); Thread.Sleep(500); // 模拟耗时 } Console.WriteLine(任务正常完成); }, token); // 将令牌传入任务 // 3. 3秒后发出取消信号 Thread.Sleep(3000); cts.Cancel(); // 触发取消 // 等待任务结束 task.Wait(); //延迟执行Task.Delay // 阻塞式延迟主线程会卡住1秒 Console.WriteLine(开始延迟...); Task.Delay(1000).Wait(); Console.WriteLine(延迟结束阻塞式); // 非阻塞式延迟需在async方法中 async static void TestDelay() { Console.WriteLine(开始非阻塞延迟...); await Task.Delay(1000); // 主线程不阻塞可继续执行其他操作 Console.WriteLine(延迟结束非阻塞式); } TestDelay(); Console.WriteLine(主线程继续执行...); // 会先于延迟结束输出 //单个任务等待Task.Wait () Task task Task.Run(() { Thread.Sleep(2000); Console.WriteLine(任务完成); }); Console.WriteLine(等待任务完成...); task.Wait(); // 主线程阻塞2秒直到任务完成 Console.WriteLine(主线程继续); //多个任务等待WaitAny 与 WaitAll阻塞式 Task[] tasks { Task.Run(() { Thread.Sleep(1000); Console.WriteLine(任务1完成); }), Task.Run(() { Thread.Sleep(2000); Console.WriteLine(任务2完成); }), Task.Run(() { Thread.Sleep(1500); Console.WriteLine(任务3完成); }) }; // 等待任意一个任务完成 int firstIndex Task.WaitAny(tasks); Console.WriteLine($第一个完成的任务索引{firstIndex}); // 输出0任务1先完成 // 等待所有任务完成 Task.WaitAll(tasks); Console.WriteLine(所有任务均已完成); //多个任务等待WhenAny 与 WhenAll非阻塞式适合异步场景。 async static void TestWhen() { Task[] tasks { Task.Run(() { Thread.Sleep(1000); return 任务1结果; }), Task.Run(() { Thread.Sleep(2000); return 任务2结果; }) }; // 等待任意任务完成非阻塞 Task firstCompleted await Task.WhenAny(tasks); Console.WriteLine($第一个完成的任务结果{(firstCompleted as Taskstring).Result}); // 任务1结果 // 等待所有任务完成非阻塞 await Task.WhenAll(tasks); Console.WriteLine(所有任务完成); } TestWhen(); //获取任务结果TaskTResult与 Result // 创建带返回值的任务 Taskint calcTask Task.Run(() { Console.WriteLine(计算12...100...); Thread.Sleep(1000); int sum 0; for (int i 1; i 100; i) sum i; return sum; // 返回计算结果 }); // 方式1通过Result获取阻塞式主线程等待 Console.WriteLine(等待结果...); int result calcTask.Result; // 阻塞直到任务完成 Console.WriteLine($结果{result}); // 输出5050 // 方式2通过await获取非阻塞式需在async方法中 async static void GetResultAsync() { int result await calcTask; // 非阻塞等待 Console.WriteLine($异步获取结果{result}); } GetResultAsync();
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

主动创新网站内容建设广东电子商务网站

贾子智慧理论:融合东西方智慧的认知与文明演化统一框架摘要: 贾子智慧理论是由贾龙栋(Kucius Teng)创立的跨学科体系,融合东方哲学与现代科学,旨在构建从认知到文明演化的统一解释框架。其核心包括四大支柱…

张小明 2025/12/27 13:49:54 网站建设

揭阳市php网站开发找工作青岛网站建设公司电话

C办公自动化终极指南:快速掌握Word文档处理 【免费下载链接】DuckX C library for creating and modifying Microsoft Word (.docx) files 项目地址: https://gitcode.com/gh_mirrors/du/DuckX 在现代办公环境中,文档处理是每个企业和个人都无法回…

张小明 2025/12/27 14:04:07 网站建设

简述网站建设的方案柚段子wordpress

PaddlePaddle镜像中的BERT模型在GPU上的微调技巧 在中文自然语言处理(NLP)任务日益复杂、对语义理解精度要求不断提升的今天,如何快速构建一个高效且稳定的模型训练环境,成为许多AI工程师面临的现实挑战。尤其是在金融、医疗、政务…

张小明 2025/12/27 20:03:08 网站建设

长春做网站哪个公司好电子营业执照

ComfyUI Manager安装GPT-SoVITS自定义节点教程在AIGC创作门槛不断降低的今天,越来越多的开发者和内容创作者希望将高质量语音合成能力无缝集成到自己的工作流中。传统的TTS工具往往依赖复杂的命令行操作、繁琐的环境配置,甚至需要数千条标注语音才能训练…

张小明 2025/12/27 14:32:05 网站建设

怎么搭建一个网站教程中企动力是做哪方面销售

你是否曾经因为抢不到心仪的演唱会门票而遗憾?在票务平台竞争激烈的今天,手动抢票已经变得越来越困难。DamaiHelper作为一款基于PythonSelenium开发的自动化抢票工具,能够帮你解决这个难题,让你轻松获取热门演出的入场券。 【免费…

张小明 2025/12/27 21:09:21 网站建设

通州网站建设多少钱什么是网站流量优化

Proteus安装总失败?别急,这份硬核排错指南让你一次搞定 你是不是也遇到过这种情况: 明明从官网下载了Proteus安装包,双击却毫无反应; 好不容易开始安装,卡在“正在注册组件”不动了; 或者提…

张小明 2025/12/27 21:10:28 网站建设