大山的LabVIEW/TestStand分享大山的LabVIEW/TestStand分享

面向 LabVIEW 与 TestStand 的个人知识分享站

LabVIEW vs C#:异步线程/VI

LabVIEW vs C#:异步线程/VI

两种语言对于异步任务的定义不太一致,但是调用思路一致

async
发布时间:2026-08-10阅读时长:25 分钟浏览 00访客仅可浏览正文内容
同步(阻塞)方式
异步(非阻塞)方式
async+await
// 异步方法:有 async,返回 Task<T>
static async Task<double> ReadSensorAsync(string name)
{
    Console.WriteLine($"  [{name}] 开始采集...");
    await Task.Delay(2000);              // 模拟 2 秒采集时间(非阻塞)
    return 20 + Random.Shared.NextDouble() * 10;
}

// 调用:用 await 等结果
double result = await ReadSensorAsync("Temp-01");
取消与超时
// CancellationToken:发出"停止"信号
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
try
{
    string data = await FetchWithTimeoutAsync(url, cts.Token);
}
catch (OperationCanceledException)
{
    Console.WriteLine("请求超时,已取消");
}
并行任务
// 启动 3 个任务(它们会同时跑)
Task<double> t1 = ReadSensorAsync("传感器1");
Task<double> t2 = ReadSensorAsync("传感器2");
Task<double> t3 = ReadSensorAsync("传感器3");

// 等全部完成(总时间 = 最慢的那个,不是三个之和)
double[] results = await Task.WhenAll(t1, t2, t3);
// results[0] = 传感器1 的结果
// results[1] = 传感器2 的结果
// results[2] = 传感器3 的结果
获取执行最快的任务
// 谁先完成用谁的结果
Task<double> winner = await Task.WhenAny(t1, t2, t3);
// winner 就是最先完成的那个任务
特性LabVIEWC# async/await
声明异步操作不需要声明,但一般建议设置 VI 为 Reentrantasync Task<T> Method()
等待结果Wait on Asynchronous Call 节点await task
并行多个任务多个 CBR 同时 Start,依次 Waitawait Task.WhenAll(t1,t2,t3)
谁先完成用谁手动比较各 CBR 的完成状态await Task.WhenAny(t1,t2,t3)
取消全局 Stop 布尔 + 各 Loop 判断CancellationToken
超时额外的超时定时器 + 比较CancellationTokenSource(TimeSpan)
异常处理Error Cluster 线串联try-catch 包住 await
异步通信Notifier / QueueChannel<T> / BlockingCollection<T>
UI 不卡死Event Structure 天然不卡UI 线程 await 不阻塞 UI

附件下载

留言区

只有注册用户可以留言和下载附件。立即注册已有账号,去登录
正在加载留言...