我正在尝试确定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
出现两个我找不到文档的问题。
我知道线程仍在试验中,但是我很好奇我是否遇到了已知限制?