【问题标题】:How to call & await async C# method from Lua / MoonSharp script?如何从 Lua / MoonSharp 脚本调用和等待异步 C# 方法?
【发布时间】:2018-11-14 05:00:12
【问题描述】:

我想从 Lua / MoonSharp 代码中调用并等待 C# 异步方法。

例如:

1).

async void Test1() {
    await Something();
}

2).

async Task Test2() {
    await Something();
}

然后从 Lua 调用它 - 1)。不等待但继续执行脚本,以及 2)。抛出ScriptRuntimeException: cannot convert clr type System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult] MoonSharp.Interpreter.Interop.Converters.ClrToScriptConversions.ObjectToDynValue 异常。

有什么办法可以做到吗?

【问题讨论】:

  • 转换器可能不知道如何转换生成的状态机。你最后想做什么?您可能需要使用Something.Wait() 进行同步块
  • @CamiloTerevinto 我正在为 Unity 游戏制作一个简单的模组系统。一些 C# 方法需要是异步的(例如加载资产包 - 以免阻塞渲染循环)。我需要从 mod 的 InitScript.lua 调用它们(在这种情况下)(因为游戏本身不太了解要加载的内容等 - 游戏只是为 Lua 脚本提供了一个 api。
  • @CamiloTerevinto 正如你提到的,我也尝试过Something.Wait(),但没有运气 - 它冻结了整个 Unity 编辑器。

标签: c# lua moonsharp


【解决方案1】:

我终于放弃了回调。不过,我认为这不是一个好的解决方案。 因此,如果有人有更好的答案,我将非常乐意更改已接受的答案。

对于任何感兴趣的人,这里是如何使回调在 MoonSharp 中工作:

Lua / MoonSharp

SomethingAsync(10, function()
    SomePrintFunction('async work done')
end)

C#

async void SomethingAsync(int whatever, DynValue callback) {
    await SomeAsyncWorkBeingDone();

    if (callback.Type == DataType.Function) {
        callback.Function.Call();
    }
}

更多信息可以在doc's找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多