11-C#

C#11的特性 C#11作为.NET 7生态系统中的重要版本,引入了多项革命性改进,显著提升了类型安全、性能优化和开发效率。本文详细探讨了C#11的核心特性及其应用场景。首先,类型系统的改进包括抽象和虚静态方法、ref字段与scoped ref、required成员等,这些特性为多态行为设计、内存管理优化和数据完整性提供了新工具。其次,异步编程的增强通过简化异步流和协变返回类型,提升了代码的灵活性和效率。字符串处理的革新则通过原始字符串文字和多行字符串插值,简化了复杂字符串操作。 阅读详情

C#.Net-多线程-Async-Await篇-学习笔记

一、async/await 基础

1.1 什么是async/await

定义

  • C# 5.0 (.NET 4.5) 引入的语法糖
  • C# 7.1 开始,Main入口也可以使用
  • C# 8.0 支持异步流(await foreach)和异步释放(await using)

什么是语法糖

  • 由编译器提供的便捷功能
  • 底层实现不变,但写代码更简洁
  • 类似的语法糖:var、表达式树、属性的get/set、字符串插值$""

1.2 基本用法

规则

// 1. async单独使用会警告,没有实际作用
public async void Method1() // 警告
{
    Console.WriteLine("没有await");
}

// 2. await必须在async方法内使用
public void Method2()
{
    await Task.Delay(1000); // 编译错误
}

// 3. async + await 配套使用
public async Task Method3()
{
    await Task.Delay(1000); // 正确
}

返回值规则

// 无返回值:返回Task(推荐)或void
public async Task NoReturnAsync()
{
    await Task.Delay(1000);
    // 默认返回Task
}

public async void NoReturnVoid()
{
    await Task.Delay(1000);
    // 不推荐,无法await或Wait
}

// 有返回值:返回Task<T>
public async Task<int> GetValueAsync()
{
    await Task.Delay(1000);
    return 123; // 实际返回Task<int>
}

为什么推荐Task而不是void

  • Task可以使用await、Wait、WhenAny、WhenAll等方法组合
  • void无法组合使用
  • Task可以捕获异常,void不行

二、async/await的核心价值

2.1 解决的问题

问题:既要有顺序,又要不阻塞

// 同步方法:有顺序,但阻塞
public void SyncMethod()
{
    Console.WriteLine("步骤1");
    Thread.Sleep(1000); // 阻塞
    Console.WriteLine("步骤2");
    Thread.Sleep(1000); // 阻塞
    Console.WriteLine("步骤3");
}

// 多线程:不阻塞,但无顺序
public void TaskMethod()
{
    Task.Run(() =>
    {
        Console.WriteLine("步骤1");
        Thread.Sleep(1000);
    });
    Task.Run(() =>
    {
        Console.WriteLine("步骤2");
        Thread.Sleep(1000);
    });
    Task.Run(() =>
    {
        Console.WriteLine("步骤3");
        Thread.Sleep(1000);
    });
    // 输出顺序不确定
}

// async/await:有顺序,不阻塞
public async Task AsyncMethod()
{
    await Task.Run(() =>
    {
        Console.WriteLine("步骤1");
        Thread.Sleep(1000);
    });
    await Task.Run(() =>
    {
        Console.WriteLine("步骤2");
        Thread.Sleep(1000);
    });
    await Task.Run(() =>
    {
        Console.WriteLine("步骤3");
        Thread.Sleep(1000);
    });
    // 按顺序输出:步骤1 -> 步骤2 -> 步骤3
}

2.2 核心理念

以同步编程的方式来写异步代码

  • 代码看起来像同步,实际是异步执行
  • 降低编程难度
  • 保持代码可读性

三、await的执行机制

3.1 执行流程

public async Task TestAsync()
{
    Console.WriteLine($"主线程ID: {Thread.CurrentThread.ManagedThreadId}");
    
    // 1. 遇到await,主线程立即返回(不阻塞)
    await Task.Run(() =>
    {
        Console.WriteLine($"子线程ID: {Thread.CurrentThread.ManagedThreadId}");
        Thread.Sleep(3000);
        Console.WriteLine("子线程完成");
    });
    
    // 2. await后的代码,由线程池的线程执行
    Console.WriteLine($"await后线程ID: {Thread.CurrentThread.ManagedThreadId}");
    Console.WriteLine("继续执行");
}

关键点

  1. 主线程遇到 await 就返回,不等待(非阻塞)
  2. await 后的代码会在 Task 完成后继续执行
  3. await 后的代码可能由子线程、主线程或其他线程执行

一个典型的执行顺序示例,能直观说明 await 的非阻塞特性:

public static void Show()
{
    Console.WriteLine($"start  线程ID: {Thread.CurrentThread.ManagedThreadId}"); // ① 主线程
    Async();  // 调用异步方法
    Console.WriteLine($"aaa    线程ID: {Thread.CurrentThread.ManagedThreadId}"); // ③ 主线程继续,不等待
}

public static async void Async()
{
    Console.WriteLine($"ddd    线程ID: {Thread.CurrentThread.ManagedThreadId}"); // ② 还是主线程
    await Task.Run(() =>
    {
        Thread.Sleep(500);
        Console.WriteLine($"bbb    线程ID: {Thread.CurrentThread.ManagedThreadId}"); // ④ 子线程
    });
    Console.WriteLine($"ccc    线程ID: {Thread.CurrentThread.ManagedThreadId}"); // ⑤ await后,线程池线程
}

实际输出顺序:start → ddd → aaa → bbb → ccc

⚠️ 注意 aaa 在 bbb 之前输出——主线程遇到 await 后立即返回继续执行,子线程的工作和主线程是并发的。

3.2 与ContinueWith的对比

async/await 出现之前,控制多个异步操作的顺序只能靠 ContinueWith 链式回调,代码可读性很差:

// 老写法:ContinueWith 链式调用控制顺序,嵌套深、难维护
Task<int> task = taskFactory.StartNew<int>(() =>
{
    Thread.Sleep(3000);
    return 123;
}).ContinueWith(c =>
{
    Thread.Sleep(3000);
    return 234;
}).ContinueWith(t =>
{
    Thread.Sleep(3000);
    return 345;
});

用 await 改写后,代码结构和同步方法一样直观:

// 新写法:await 顺序执行,清晰易读
public async Task UseAwait()
{
    await Task.Run(() => { Thread.Sleep(3000); Console.WriteLine("步骤1"); });
    await Task.Run(() => { Thread.Sleep(3000); Console.WriteLine("步骤2"); });
    await Task.Run(() => { Thread.Sleep(3000); Console.WriteLine("步骤3"); });
}

await 的优势

  • 代码更简洁,可读性更好
  • 写法像同步代码,实际是异步执行
  • 自动处理异常传播,不需要手动在每个 ContinueWith 里 try-catch

四、带返回值的async方法

4.1 基本用法

public async Task<long> SumAsync()
{
    Console.WriteLine($"开始计算,线程ID: {Thread.CurrentThread.ManagedThreadId}");
    
    long result = 0;
    
    // 第一个计算
    await Task.Run(() =>
    {
        Console.WriteLine($"计算1,线程ID: {Thread.CurrentThread.ManagedThreadId}");
        for (long i = 0; i < 999_999_999; i++)
        {
            result += i;
        }
    });
    
    Console.WriteLine($"计算1完成,线程ID: {Thread.CurrentThread.ManagedThreadId}");
    
    // 第二个计算
    await Task.Run(() =>
    {
        Console.WriteLine($"计算2,线程ID: {Thread.CurrentThread.ManagedThreadId}");
        for (long i = 0; i < 999_999_999; i++)
        {
            result += i;
        }
    });
    
    Console.WriteLine($"计算2完成,线程ID: {Thread.CurrentThread.ManagedThreadId}");
    
    return result; // 自动包装成Task<long>
}

4.2 调用方式

// 方式1:await(推荐,不阻塞)
public async Task CallAsync()
{
    long result = await SumAsync();
    Console.WriteLine($"结果: {result}");
}

// 方式2:Result(不推荐,阻塞)
public void CallSync()
{
    long result = SumAsync().Result; // 阻塞,相当于同步
    Console.WriteLine($"结果: {result}");
}

// 方式3:Wait(不推荐,阻塞)
public void CallWait()
{
    Task<long> task = SumAsync();
    task.Wait(); // 阻塞
    long result = task.Result;
    Console.WriteLine($"结果: {result}");
}

注意

  • 访问Result或Wait会阻塞,失去async/await的意义
  • 推荐使用await,保持异步特性

五、async/await的底层实现

5.1 状态机

IL代码分析

// C#代码
public async Task SimpleMethod()
{
    await Task.Delay(1000);
    Console.WriteLine("完成");
}

// 编译后生成状态机(简化版)
private struct StateMachine
{
    public int state;
    public AsyncTaskMethodBuilder builder;
    
    public void MoveNext()
    {
        try
        {
            switch (state)
            {
                case 0:
                    // 执行await之前的代码
                    var awaiter = Task.Delay(1000).GetAwaiter();
                    if (!awaiter.IsCompleted)
                    {
                        state = 1;
                        // 等待完成
                        return;
                    }
                    goto case 1;
                    
                case 1:
                    // 执行await之后的代码
                    Console.WriteLine("完成");
                    state = -2;
                    break;
            }
        }
        catch (Exception ex)
        {
            state = -2;
            builder.SetException(ex);
        }
        
        builder.SetResult();
    }
}

状态机执行流程

  1. 实例化状态机
  2. 将状态机交给builder执行
  3. 整理线程上下文
  4. 调用MoveNext()方法
  5. 根据状态执行不同分支
  6. 异常时状态重置为-2
  7. 完成时调用SetResult()

5.2 状态机的价值

类比:红绿灯

  • 红灯:停止
  • 绿灯:行驶
  • 黄灯:减速

状态机

  • 一个对象在不同状态下执行不同行为
  • await将方法分割成多个状态
  • 每个状态对应一个await

六、性能对比

6.1 文件读取对比

// 1. Async版本(推荐)
private async Task<byte[]> ReadAsync(string path)
{
    Console.WriteLine($"ReadAsync开始,线程ID: {Thread.CurrentThread.ManagedThreadId}");
    
    var result = await File.ReadAllBytesAsync(path);
    // 读取文件时,没有开启新线程
    // 主线程告诉系统要做什么,然后就返回了
    // 降低了线程开启数量,降低了CPU负荷
    
    Console.WriteLine($"ReadAsync结束,线程ID: {Thread.CurrentThread.ManagedThreadId}");
    return result;
}

// 2. Task版本
private Task<byte[]> ReadTask(string path)
{
    Console.WriteLine($"ReadTask开始,线程ID: {Thread.CurrentThread.ManagedThreadId}");
    
    var result = Task.Run(() =>
    {
        Console.WriteLine($"ReadTask执行,线程ID: {Thread.CurrentThread.ManagedThreadId}");
        return File.ReadAllBytes(path);
    });
    // 铁定开启新线程
    
    Console.WriteLine($"ReadTask结束,线程ID: {Thread.CurrentThread.ManagedThreadId}");
    return result;
}

// 3. Sync版本
private byte[] ReadSync(string path)
{
    Console.WriteLine($"ReadSync开始,线程ID: {Thread.CurrentThread.ManagedThreadId}");
    var result = File.ReadAllBytes(path);
    Console.WriteLine($"ReadSync结束,线程ID: {Thread.CurrentThread.ManagedThreadId}");
    return result;
}

性能测试结果

20次读取大文件:
- Async: 约3000ms
- Task:  约3500ms
- Sync:  约6000ms

6.2 Web请求对比

// 1. Async版本(推荐)
private async Task<string> WebAsync(string url)
{
    HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
    
    // 使用异步版本的API
    using (HttpWebResponse response = await request.GetResponseAsync() as HttpWebResponse)
    {
        StreamReader sr = new StreamReader(response.GetResponseStream());
        return await sr.ReadToEndAsync(); // 异步读取
    }
}

// 2. Task版本
private Task<string> WebTask(string url)
{
    return Task.Run(() =>
    {
        return InvokeWebRequest(url); // 同步方法包装
    });
}

// 3. Sync版本
private string WebSync(string url)
{
    return InvokeWebRequest(url);
}

性能测试结果

10次Web请求(每次5秒):
- Async: 约5秒(并发)
- Task:  约5秒(并发)
- Sync:  约50秒(串行)

6.3 CPU密集型计算对比

// 1. Async版本
private async Task<long> CalculationAsync(long total)
{
    return await Task.Run(() =>
    {
        long result = 0;
        for (long i = 0; i < total; i++)
        {
            result += i;
        }
        return result;
    });
}

// 2. Task版本
private Task<long> CalculationTask(long total)
{
    return Task.Run(() =>
    {
        long result = 0;
        for (long i = 0; i < total; i++)
        {
            result += i;
        }
        return result;
    });
}

// 3. Sync版本
private long CalculationSync(long total)
{
    long result = 0;
    for (long i = 0; i < total; i++)
    {
        result += i;
    }
    return result;
}

性能测试结果

10次计算(每次10亿次循环):
- Task:  约8秒
- Async: 约8秒
- Sync:  约80秒

结论

  • CPU密集型:Async和Task性能相同,都需要开启线程
  • IO密集型:Async性能更好,不需要额外线程

七、适用场景

7.1 适合使用async/await的场景

1. IO密集型操作(推荐)

// 文件操作
await File.ReadAllBytesAsync(path);
await File.WriteAllTextAsync(path, content);

// 数据库操作
await connection.OpenAsync();
await command.ExecuteNonQueryAsync();

// Web请求
await httpClient.GetStringAsync(url);

// Redis操作
await redis.StringGetAsync(key);

2. 与第三方交互(非托管资源)

  • 数据库查询
  • Redis缓存
  • Web API调用
  • 文件读写

7.2 不适合使用async/await的场景

1. CPU密集型计算(不推荐)

// 不推荐:async/await对CPU密集型无优势
public async Task<long> CalculateAsync()
{
    return await Task.Run(() =>
    {
        // 大量计算
        long result = 0;
        for (long i = 0; i < 1_000_000_000; i++)
        {
            result += i;
        }
        return result;
    });
}

// 推荐:直接使用Task
public Task<long> CalculateTask()
{
    return Task.Run(() =>
    {
        long result = 0;
        for (long i = 0; i < 1_000_000_000; i++)
        {
            result += i;
        }
        return result;
    });
}

2. 本地计算(托管资源)

  • 内存中的数据处理
  • 算法计算
  • 数据转换

八、不同框架中的应用

8.1 ASP.NET Core(推荐使用)

[HttpGet]
public async Task<IActionResult> GetDataAsync()
{
    var data = await _service.GetDataAsync();
    return Ok(data);
}

优势

  • 不阻塞线程池线程
  • 提高服务器并发能力
  • 可以处理更多请求

8.2 控制台应用(可以使用)

// C# 7.1+
static async Task Main(string[] args)
{
    await DoWorkAsync();
}

8.3 WinForms(需要注意)

private async void btnClick_Click(object sender, EventArgs e)
{
    // 不阻塞UI线程
    var result = await GetDataAsync();
    
    // await后的代码在UI线程执行,可以直接更新UI
    lblResult.Text = result;
}

注意事项

  • 事件处理器可以使用async void
  • await后的代码会回到UI线程
  • 可以直接更新UI控件

8.4 WPF(类似WinForms)

private async void Button_Click(object sender, RoutedEventArgs e)
{
    var result = await GetDataAsync();
    TextBlock.Text = result;
}

九、C# 8.0 新特性

9.1 异步流(await foreach)

// 生成异步序列
public async IAsyncEnumerable<int> GenerateSequence()
{
    for (int i = 0; i < 20; i++)
    {
        await Task.Delay(100);
        yield return i;
    }
}

// 消费异步序列
private async Task ConsumeAsync()
{
    await foreach (var i in GenerateSequence())
    {
        Console.WriteLine($"接收到: {i}");
    }
}

9.2 异步释放(await using)

await using (var resource = new AsyncDisposableResource())
{
    // 使用资源
}
// 自动调用DisposeAsync()

十、最佳实践

10.1 命名规范

// 异步方法以Async结尾
public async Task<string> GetDataAsync()
{
    return await _repository.QueryAsync();
}

10.2 避免async void

// 错误:无法捕获异常,无法await
public async void BadMethodAsync()
{
    await Task.Delay(1000);
}

// 正确:返回Task
public async Task GoodMethodAsync()
{
    await Task.Delay(1000);
}

// 例外:事件处理器可以使用async void
private async void Button_Click(object sender, EventArgs e)
{
    await DoWorkAsync();
}

10.3 避免阻塞

// 错误:阻塞
var result = GetDataAsync().Result;

// 错误:阻塞
GetDataAsync().Wait();

// 正确:异步等待
var result = await GetDataAsync();

10.4 ConfigureAwait

// 库代码中使用,避免捕获上下文
var result = await GetDataAsync().ConfigureAwait(false);

// UI代码中不使用,需要回到UI线程
var result = await GetDataAsync();

十一、小结

  • async/await 是语法糖:底层是状态机实现
  • 核心价值:以同步方式写异步,降低编程难度
  • 适用场景:IO 密集型操作(文件、网络、数据库)
  • 不适用场景:CPU 密集型计算
  • 性能提升:提高吞吐量,不是降低单个请求时间
  • 避免阻塞:不要使用 Result 或 Wait
  • 命名规范:异步方法以 Async 结尾
  • 返回类型:优先使用 Task,避免 void
C# 11 新特性 文本简要介绍C# 11 (对应的是.Net 7)新增的功能。 阅读详情

相关推荐

Ubuntu系统下USB无线网卡无法识别的解决方案

Realtek的USB设备可能是无线网卡、有线网卡、读卡器等,系统仅知道“这是Realtek的USB设备”,但不知道“如何将其作为无线网卡驱动”。通过以上步骤,RTL8812AU 芯片的 Edimax 无线网卡应能被 Ubuntu 识别并正常工作。Realtek等品牌的无线网卡可能被系统简单识别为"USB设备",但未匹配到对应的无线驱动,导致设备无法发挥网络功能。是系统识别了USB设备,却未正确加载无线网卡驱动。(前4位是厂商ID,后4位是产品ID),显示设备已识别,但网络管理工具无反应,

极地星辰 3459

C# 11 中的新增功能

我们很高兴地宣布 C# 11 已经发布!与往常一样,C# 开辟了一些全新的领域,同时推进了过去版本中一直在运行的几个主题。我们的文档页面上的 C# 11 的新增功能下有许多功能和详细信息,这些内容都得到了很好的介绍。随着每个版本的发布,社区的参与度越来越高,他们贡献了从建议、见解和 bug 报告一直到整个功能实现的所有内容。这真的是每个人的C#。谢谢!默认情况下,C# 字符串被硬编码为 UTF-16,而互联网上流行的字符串编码是 UTF-8。为了最大限度地减少转换的麻烦和性能开销,您现在只需将 u8 后缀附

微软技术栈 3133

SystemVerilog学习总结

因为选择的offer是IC验证,以前学的是设计,所以只能再学systemverilog(SV)和UVM了。在学习SV和UVM之前,我认为需要学习以下几个部分:数字电路、c++和verilog。因为IC验证确实有不少别的专业之前没学过数字电路和Verilog,所以还是最好先学习一下。 知识点的总结主要是通过systemverilog验证-测试平台编写指南这本书进行的,所以请看书。通过对这本书的目录进行重点的划分,然后再进行相关知识点的总结。最后,给出自己收集的别的博主IC EDA环境的虚拟机,以及使用虚拟机需

博主毕竟还是人,肯定会有错误,各位看的时候发现错误提出来就好 1万+

【C#深度学习之路】如何使用C#实现Yolov11模型的训练和推理

本文在Yolov5的基础上讲解Yolov11模型的改善点,可以借助之前的资料实现Yolov11模型的训练和推理

qq_30270773的博客 3583

NVIDIA Jetson Orin系列 - 使用SDK Manager安装JetPack全流程解析

本文详细解析了使用NVIDIA官方SDK Manager为Jetson Orin系列开发板安装JetPack系统的完整流程。从环境准备、设备进入恢复模式,到SDK Manager图形化界面的分步操作指南,提供了新手友好的全流程解析,并分享了安装后的验证方法及常见问题解决方案,帮助开发者高效搭建稳定的边缘AI开发环境。

nn3456的博客 405

帆软报表导出各种格式之后台导出

我们前面介绍了帆软报表在界面上的导出是通过类似的URL:http://localhost:8075/webroot/decision/view/report?op=export&sessionID=10653244-3e46-408c-bc54-f89a214a9bc7&format=image&extype=PNG 来完成的,就是带OP=export以及format参数来完成的。如果不从界面传参数,比如我们自己实现了一个HTTP接口,也可以通过传参数format来完成各种格式的导

帆软爱好者的专栏 4268

C# 11 预览版

C# 11即将完成。这篇文章涵盖了 Visual Studio 17.3 中的新功能,和我们在和中未涵盖的功能。:无论您想对可变和不可变成员实施什么规则,您都可以更轻松地支持类型中的构造函数和对象初始值设定项。特点包括:Required 成员ref字段:您可以为多种数字类型编写一次算法。这些功能使用 C# 和 .NET 进行统计、机器学习和其他数学密集型应用程序变得更加容易。特点包括:接口中的静态抽象和静态虚拟成员放宽右移要求无符号右移运算符数值IntPtr]

微软技术栈 1168

深入剖析 YOLOv11 中的 C2PSA 注意力机制

YOLOv11中的C2PSA注意力机制在目标检测领域取得突破性进展。该机制通过跨通道分组交互和轻量级位置编码,在仅增加0.6%计算量的情况下提升mAP 1.5-2.3个百分点。C2PSA创新性地结合局部跨通道交互、位置编码和双分支并行调制,采用纯卷积实现自注意力,避免传统注意力机制的高计算复杂度。实验表明,C2PSA在COCO数据集上以微小计算代价显著提升检测性能,特别是对小目标和遮挡目标效果突出。该模块可直接嵌入YOLO架构,为轻量级目标检测提供新的优化方向。

shrgegrb的博客 3396

C# 11正式发布

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C# 11 现已发布。公告称,“随着每个版本的发布,社区的参与度越来越高,贡献了从建议、见解和错误报告到整个功能实现的所有内容。这真的是每个人的 C#。”新版本中的一些亮点更新内容包括:UTF-8 字符串(UTF-8 String Literals)默认情况下,C# 字符串被硬编码为 UTF-16...

轻松学C语言 1009

Oracle EBS AP 应付模块核心实现逻辑(极简骨架 + 分层拆解 + 业务流转 + 分录 + 核心表)

Oracle EBS AP应付模块采用四层逻辑架构:1)主数据层统一管控供应商基础信息;2)发票负债层通过三单匹配校验生成应付账款;3)付款核销层实现负债冲减;4)SLA层自动生成财务凭证。核心流程包括发票验证(匹配PO/收货单)、付款核销(全额/部分冲账)、会计分录自动生成(通过SLA引擎)。模块严格遵循"无匹配不负债、无验证不入账"原则,与采购、库存等模块深度集成,实现从供应商创建到付款核销的完整业务闭环,确保应付账款准确性和审计追溯能力。

金牌架构师 439

工业级Modbus ASCII实时监控系统(WinForms完整实现)

本文介绍了一个基于WinForms的工业级Modbus ASCII实时监控系统实现方案。该系统采用经典工控界面布局,包含串口配置、数据采集控制和实时数据显示三大区域。核心功能包括:串口通信参数设置、Modbus从站地址配置、寄存器数据采集、实时数据表格展示和趋势图绘制。系统通过ModbusAsciiClient类实现通信核心,采用定时器轮询机制采集数据,支持最多100个数据点的历史趋势显示。界面设计注重用户体验,配置区位于左侧,主显示区在右侧,底部为状态和日志区,符合工业控制系统的操作习惯。代码示例展示了窗

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 276

C# 11 中的 required members

C# 11 中的 required membersIntro在 C# 11 中引入了一个新的特性 —— Required Members,引入了一个新的 required 关键词,可以用来表示字段或者属性在类型初始化的时候必须要进行初始化,这一特性也进一步的改进了可空引用类型的用法。Sample示例如下:privaterecordPerson { publicrequiredstr...

zls365365的博客 332

【音视频 ffmpeg 学习】 RTMP推流 mp4文件

3.当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。1.RTMP(实时消息传输协议)是Adobe 公司开发的一个基于TCP的应用层协议。2.RTMP协议中基本的数据单元称为消息(Message)。下载地址:http://nginx.org/download。下载 rtmp模块 到nginx 模块下。安装nginx 和 rtmp模块。(1). linux 环境准备。下载nginx安装包。使用 vcl 播放流。

weixin_45397344的博客 2273

C# 11 更加实用的 nameof

C# 11 更加实用的 nameofIntro从 C# 6.0 开始,我们可以开始使用 nameof 来引用参数名称,在可能使用 nameof 的地方,一般都推荐使用以便于重构时的自动更新,在之前的 C# 版本中,如果想要在方法参数中或者方法 attribute 中通过 nameof 来引用方法会编译报错,从 C# 11 开始,扩展了 nameof 的作用域,我们就可以使...

dotNET跨平台 469

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C#11之原始字符串

最近.NET7.0和C#11相继发布,笔者也是第一时间就用上了C#11,其中C#11的有一个更新能解决困扰我多年的问题,也就是文章的标题原始字符串。在使用C#11的原始字符串时,发现的一些有意思的东西,超出了我原本对它的期待,话不多说,我们一起来看看。多年的困扰我不知道大家有没有写过这样的代码,在单元测试里面我需要创建一个JSON字符串,比如像下面这样的:{ "FareRules":["1",...

farway000的博客 225

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C# 11:接口中的静态抽象成员

接口我们都很了解了,在编写代码的时,如果有一定的抽象思维,就会将不同对象的相同行为抽象出来,放到接口中,我们最熟悉的就是在接口中写一堆方法的定义。微软似乎一直都想在接口上做改进。在 C# 8 中,接口中可以进行方法的定义,也就是默认接口方法,这个功能最大的好处是,当在接口中进行方法扩展时,之前的实现类可以不受影响,而在 C# 8 之前,接口中如果要添加方法,所有的实现类需要进行新增接口方法的实现,...

zls365365的博客 561

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C# 11 预览,又增加了实用的语法糖

文| 罗奇奇出品 | OSC开源社区(ID:oschina2013).NET 首席项目经理凯瑟琳在博客中介绍了 C# 11 的一些预览性新功能,这些功能可以在 Visual Studio...

dotNET跨平台 1103

[转]C# 11 中的新增功能

可以下载最新版本。还可以使用 .NET 7 SDK 试用所有这些功能,该 SDK 可从。备注我们对你对这些功能的反馈感兴趣。如果发现这些新功能存在问题,请在存储库中创建新。

iml6yu的博客 294

C# 11 新增特性

.NET 首席项目经理凯瑟琳博客介绍了 C# 11 的一些预览性新功能,这些功能可以在Visual Studio 17.1和 .NET SDK 6.0.200 中体验,下面摘录一部分新特性作介绍: C# 11 预览:允许在内插字符串的“插值表达式”中换行 2.C# 11 预览:列表模式 3.C# 11 预览:新的参数空值检查 有关 C# 11 的更多详细内容,请查看博客原文,或通过 GitHub 上的CSharpLang 存...

ejinxian的专栏 509

C# 使用OnnxRuntime 部署yolov11 (Detection)

i < rows;j++)*.jpg;*.jpeg;*.tiff;*.tiff;*.png";set;set;set;set;

Major_S的博客 7012

C#11新特性学习

本文为C#11.0的学习笔记,参考文章:https://blog.youkuaiyun.com/nmmking/article/details/130036566

weixin_46102505的博客 633

基于vs2022+C#实现yolov11的推理

还有另外一种方式(第二步的另一种方式)就是通过dll添加,添加如下图的程序集的几个dll,并且安装onnxRuntime工具包。下的推理部署做个基本的介绍,该推理的部署包含detect,segment,obb,classify,pose的使用,希望大家共同交流学习!到此就完整的实现了C#的yolov11部署。第三步:在form框架下,自己添加图像窗口,日志窗口和推理按键等这部分就不再描述,添加完成后,添加这几个应用。然后就修改名字,一直点击“下一步”,到这里选择.NET8.0的框架,然后创建就可以了。

weixin_43997632的博客 3157
上一篇: 09-C#
下一篇: 07-C#
似水明俊德
博客等级 码龄8年 247粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值