SpacetimeDB icon indicating copy to clipboard operation
SpacetimeDB copied to clipboard

Replace `Thread.Start` with `Task.Run` / C# Blazor Support

Open CloneDeath opened this issue 10 months ago • 1 comments

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

  1. spacetime start
  2. Publish the DB to quickstart-chat locally
  3. Build and run the "WebClient" project
  4. 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

CloneDeath avatar Mar 10 '25 11:03 CloneDeath

Thanks for reporting! We'll look into this.

bfops avatar Apr 02 '25 17:04 bfops

I think this might be resolved as of https://github.com/clockworklabs/com.clockworklabs.spacetimedbsdk/pull/286 ?

bfops avatar May 05 '25 16:05 bfops

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

alex47 avatar Jul 19 '25 12:07 alex47

Thanks for letting us know! Looks like there's more work here than just replacing Thread.Start with Task.Run then.

bfops avatar Jul 21 '25 17:07 bfops

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

bfops avatar Jul 21 '25 17:07 bfops

I created a pull request to address this issue: https://github.com/clockworklabs/com.clockworklabs.spacetimedbsdk/pull/353

alex47 avatar Jul 21 '25 19:07 alex47