uno-platform支持WASM(Webassembly)项目有多少个线程?

时间:2020-10-21 05:34:41

标签: multithreading webassembly uno-platform

我正在尝试确定uno平台是否适用于要作为WebAssembly应用程序部署的特定项目。

我已经与Uno一起玩了,并使用以下命令配置了新的线程支持:

 <MonoWasmRuntimeConfiguration>threads-release</MonoWasmRuntimeConfiguration>

据我了解,线程支持目前仅在Chrome和Edge中可用...但这可以满足我的需求。

我已经创建了一个简单的按钮,它应该可以像这样旋转10个工作线程:

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                var t = new Thread(() => DoWork());
                t.Start();

            }

        }

        private void DoWork()
        {
            for (int n = 0; n < 10000; n++)
            {
                Console.WriteLine($"Task {Thread.CurrentThread.ManagedThreadId} running {n}");
            }
        }

此代码是从uno平台模板添加到默认“ hello world” WASM项目的唯一内容。

查看输出时,我可以看到2个线程正在按预期工作并交织在一起。 (在<MonoWasmRuntimeConfiguration>threads-release</MonoWasmRuntimeConfiguration>之前,输出将针对单个“线程”同步,然后针对下一个“线程”同步)

运行3987的任务3

正在运行9843的任务2

运行3988的任务3

两个线程完成时,在浏览器控制台中会记录以下警告。

PThread 70424616 is attempting to join to itself!
__emscripten_do_pthread_join @ dotnet.js:1
_pthread_join @ dotnet.js:1
mono_native_thread_join @ 00806cba:0x70078
threads_native_thread_join_lock @ 00806cba:0xbfd98
mono_threads_join_threads @ 00806cba:0x6aefe
mono_runtime_do_background_work @ 00806cba:0xdb520
mono_background_exec @ 00806cba:0xf89c5
Module._mono_background_exec @ dotnet.js:1
pump_message @ dotnet.js:1
setTimeout (async)
_schedule_background_exec @ dotnet.js:1
mono_threads_schedule_background_job @ 00806cba:0x1612c
mono_threads_add_joinable_runtime_thread @ 00806cba:0xd8aa4
sgen_client_thread_detach_with_lock @ 00806cba:0xc67bd
thread_detach_with_lock @ 00806cba:0xc0142
unregister_thread @ 00806cba:0x5e469
mono_thread_info_detach @ 00806cba:0xd98c6
mono_thread_info_exit @ 00806cba:0x49724
start_wrapper @ 00806cba:0xc1206
dynCall_ii @ 00806cba:0x11d3d7
Module.dynCall_ii @ dotnet.js:1
onmessage @ dotnet.worker.js:1

出现两个我找不到文档的问题。

  1. 为什么只有2个线程? (在Chrome和Edge上)这是浏览器的限制吗?在Uno平台上进行设置?
  2. 为什么其余8个线程无法启动?它们实际上丢失了,没有任何工作得以执行。这是uno平台中的错误吗?单核细胞增多症?可能是脚本?

我知道线程仍在试验中,但是我很好奇我是否遇到了已知限制?

0 个答案:

没有答案