Replace `Thread.Start` with `Task.Run` / C# Blazor Support
System.Threading.Thread.Start() is not supported for browsers.
Instead, async/await with Task.Run is preferred, as it runs for all platforms (including browser).
The issue can be reproduced here: https://github.com/CloneDeath/SpacetimeWebChat
spacetime start- Publish the DB to
quickstart-chatlocally - Build and run the "WebClient" project
- Navigate to the host in a browser, with the console open
Expected: No errors
Actual: You will see the below error printed to the console
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. blazor.webassembly.js:1:46936
---> System.PlatformNotSupportedException: Operation is not supported on this platform. blazor.webassembly.js:1:46936
at System.Threading.Thread.ThrowIfNoThreadStart(Boolean internalThread) blazor.webassembly.js:1:46936
at System.Threading.Thread.Start(Boolean captureContext, Boolean internalThread) blazor.webassembly.js:1:46936
at System.Threading.Thread.Start() blazor.webassembly.js:1:46936
at SpacetimeDB.DbConnectionBase`3[[SpacetimeDB.Types.DbConnection, WebClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[SpacetimeDB.Types.RemoteTables, WebClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[SpacetimeDB.Types.Reducer, WebClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]..ctor() blazor.webassembly.js:1:46936
at SpacetimeDB.Types.DbConnection..ctor() in /home/nicholas/Projects/Games/MMO/quickstart-chat/WebClient/module_bindings/SpacetimeDBClient.g.cs:line 422 blazor.webassembly.js:1:46936
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Constructor(Object obj, IntPtr* args) blazor.webassembly.js:1:46936
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) blazor.webassembly.js:1:46936
--- End of inner exception stack trace --- blazor.webassembly.js:1:46936
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) blazor.webassembly.js:1:46936
at System.RuntimeType.CreateInstanceMono(Boolean nonPublic, Boolean wrapExceptions) blazor.webassembly.js:1:46936
at System.RuntimeType.CreateInstanceOfT() blazor.webassembly.js:1:46936
at System.Activator.CreateInstance[DbConnection]() blazor.webassembly.js:1:46936
at SpacetimeDB.DbConnectionBuilder`1[[SpacetimeDB.Types.DbConnection, WebClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]..ctor() blazor.webassembly.js:1:46936
at SpacetimeDB.DbConnectionBase`3[[SpacetimeDB.Types.DbConnection, WebClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[SpacetimeDB.Types.RemoteTables, WebClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[SpacetimeDB.Types.Reducer, WebClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].Builder() blazor.webassembly.js:1:46936
at WebClient.ServerApi.ConnectToDB() in /home/nicholas/Projects/Games/MMO/quickstart-chat/WebClient/ServerApi.cs:line 32 blazor.webassembly.js:1:46936
at WebClient.ServerApi.Run() in /home/nicholas/Projects/Games/MMO/quickstart-chat/WebClient/ServerApi.cs:line 22 blazor.webassembly.js:1:46936
Thanks for reporting! We'll look into this.
I think this might be resolved as of https://github.com/clockworklabs/com.clockworklabs.spacetimedbsdk/pull/286 ?
I get this exact same error using the latest spacetimedb (1.2.0) and client SDK (1.2.1) release. I'm trying to connect to spacetimedb from a Blazor webassembly project.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> System.PlatformNotSupportedException: Operation is not supported on this platform.
at System.Threading.Thread.ThrowIfNoThreadStart(Boolean internalThread)
at System.Threading.Thread.Start(Boolean captureContext, Boolean internalThread)
at System.Threading.Thread.Start()
at SpacetimeDB.DbConnectionBase`3[[SpacetimeDB.Types.DbConnection, NetConnectBlazor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[SpacetimeDB.Types.RemoteTables, NetConnectBlazor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[SpacetimeDB.Types.Reducer, NetConnectBlazor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]..ctor()
at SpacetimeDB.Types.DbConnection..ctor() in C:\\Users\\Alex\\Desktop\\stdb\\NetConnectBlazor\\ModuleBindings\\SpacetimeDBClient.g.cs:line 460
at System.Object.InvokeStub_DbConnection..ctor(Object , Object , IntPtr* )
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
--- End of inner exception stack trace ---
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
at System.RuntimeType.CreateInstanceMono(Boolean nonPublic, Boolean wrapExceptions)
at System.RuntimeType.CreateInstanceOfT()
at System.Activator.CreateInstance[DbConnection]()
at SpacetimeDB.DbConnectionBuilder`1[[SpacetimeDB.Types.DbConnection, NetConnectBlazor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]..ctor()
at SpacetimeDB.DbConnectionBase`3[[SpacetimeDB.Types.DbConnection, NetConnectBlazor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[SpacetimeDB.Types.RemoteTables, NetConnectBlazor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[SpacetimeDB.Types.Reducer, NetConnectBlazor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].Builder()
at NetConnectBlazor.Services.SpacetimeDBInit.ConnectToDB() in C:\\Users\\Alex\\Desktop\\stdb\\NetConnectBlazor\\Services\\SpacetimeDBInit.cs:line 40
at NetConnectBlazor.Services.SpacetimeDBInit.InitSpacetimeDB() in C:\\Users\\Alex\\Desktop\\stdb\\NetConnectBlazor\\Services\\SpacetimeDBInit.cs:line 20
Thanks for letting us know! Looks like there's more work here than just replacing Thread.Start with Task.Run then.
Oh actually from that backtrace, it looks like we're still calling Thread.Start somewhere.
Edit: Yup it's in sdks/csharp/src/SpacetimeDBClient.cs
I created a pull request to address this issue: https://github.com/clockworklabs/com.clockworklabs.spacetimedbsdk/pull/353