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
相关产品推荐
相关产品推荐

