opengl C# SDL2和异步方法

3wabscal  于 2022-11-04  发布在  C#
关注(0)|答案(1)|浏览(263)

我用C#编写了我的SDL 2应用程序。我的应用程序进行基本的渲染和一些实体逻辑。因为我所有的逻辑都是以同步方式处理的,所以我决定改用异步方式。
我的实体有Task TickAsync(float deltaTime);抽象方法来执行实体逻辑。我的调用栈看起来像这样:

  1. Task Main(string[]?);
  2. await RunAsync(CancellationToken);
  3. await ExecuteEntitiesAsync(CancellationToken);
  4. await entity.TickAsync(float);
    我的问题:因为我使用的是SDL 2和OpenGL,所以这些库需要在一个线程中运行(SDL 2在这里初始化,OpenGL上下文在这里创建。据我所知,当任务创建时,它在其他上下文中执行(可以在当前线程中执行,也可以不在当前线程中执行)。因为RunAsync是异步方法,drawcall可以不在当前线程中执行(我在Main方法中初始化了SDL 2)。RunAsync必须是异步的,因为它为所有实体调用await Task.WhenAll()
    我的问题:如何使异步方法在当前上下文/线程中执行或同步执行?
utugiqy6

utugiqy61#

因为我所有的逻辑都是以同步方式处理的,所以我决定改用异步方式。
我真的不确定这是不是一个好主意。TickAsync真的有异步工作要做吗?
假设这 * 就是 * 您所需要的,那么您可以创建一个单线程的SynchronizationContext,这并不简单。我推荐使用我的AsyncEx library中的AsyncContext。然后您的(同步)Main只需调用AsyncContext.Run并传递一个包含顶层逻辑的委托(例如,RunAsync)。

相关问题