You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何为三角化函数实现async/await异步调用?

正确实现异步三角生成方法的方案

你遇到的"cannot await void"错误,是因为await关键字只能用于等待可等待类型(Task/Task<T>),而你的同步Triangulate方法返回void,不符合要求。下面是两种针对CPU密集型三角生成场景的正确实现方式:

方案1:用Task.Run包装同步操作(最常用)

由于三角生成属于CPU密集型计算,适合将同步逻辑放到后台线程执行,避免阻塞主线程。直接用Task.Run包装同步方法即可,无需额外的async/await(除非需要处理异常或额外逻辑):

public static Task TriangulateAsync(IReadOnlyList<Point> verts, List<Triangle> triangles)
{
    // 注意:List<Triangle>不是线程安全的,确保调用方不会在异步执行期间操作该列表
    return Task.Run(() => Triangulate(verts, triangles));
}

// 原同步方法保持不变
public static void Triangulate(in IReadOnlyList<Point> verts, in List<Triangle> triangles)
{
   // 常规三角生成逻辑
}

如果想避免共享列表的线程安全问题,建议让异步方法直接返回生成的三角形列表,而非传入:

public static Task<List<Triangle>> TriangulateAsync(IReadOnlyList<Point> verts)
{
    return Task.Run(() => 
    {
        var triangles = new List<Triangle>();
        Triangulate(verts, triangles);
        return triangles;
    });
}

方案2:将内部逻辑改为真正异步(仅当有异步计算API时适用)

如果你的三角生成逻辑中存在可异步执行的操作(比如调用第三方异步计算库),可以将同步方法重构为返回Task的异步方法:

public static async Task TriangulateAsync(IReadOnlyList<Point> verts, List<Triangle> triangles)
{
    // 替换为实际的异步计算逻辑
    await SomeAsyncTriangulationLogic(verts, triangles);
}

// 若有异步底层方法
private static Task SomeAsyncTriangulationLogic(IReadOnlyList<Point> verts, List<Triangle> triangles)
{
    // 异步三角生成逻辑
}

关键注意事项

  • 不要为了异步而异步:如果三角生成逻辑本身没有异步IO或可并行的异步操作,方案1的Task.Run是最合理的选择。
  • 线程安全:List<Triangle>不是线程安全集合,若多个线程同时操作该列表会引发异常,优先选择返回新列表的方式。

内容的提问来源于stack exchange,提问作者WDUK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:02:55