我用C#编写了我的SDL 2应用程序。我的应用程序进行基本的渲染和一些实体逻辑。因为我所有的逻辑都是以同步方式处理的,所以我决定改用异步方式。
我的实体有Task TickAsync(float deltaTime);
抽象方法来执行实体逻辑。我的调用栈看起来像这样:
Task Main(string[]?);
个await RunAsync(CancellationToken);
await ExecuteEntitiesAsync(CancellationToken);
await entity.TickAsync(float);
我的问题:因为我使用的是SDL 2和OpenGL,所以这些库需要在一个线程中运行(SDL 2在这里初始化,OpenGL上下文在这里创建。据我所知,当任务创建时,它在其他上下文中执行(可以在当前线程中执行,也可以不在当前线程中执行)。因为RunAsync
是异步方法,drawcall可以不在当前线程中执行(我在Main
方法中初始化了SDL 2)。RunAsync
必须是异步的,因为它为所有实体调用await Task.WhenAll()
。
我的问题:如何使异步方法在当前上下文/线程中执行或同步执行?
1条答案
按热度按时间utugiqy61#
因为我所有的逻辑都是以同步方式处理的,所以我决定改用异步方式。
我真的不确定这是不是一个好主意。
TickAsync
真的有异步工作要做吗?假设这 * 就是 * 您所需要的,那么您可以创建一个单线程的
SynchronizationContext
,这并不简单。我推荐使用我的AsyncEx library中的AsyncContext
。然后您的(同步)Main
只需调用AsyncContext.Run
并传递一个包含顶层逻辑的委托(例如,RunAsync
)。