C
C#7mo ago
JakeWindle

SignalR client method calling C#/JS interop, hangs indefinitely.

Hey all, I have a project that I've been working on that involves heavy usage of SignalR and C#/JS interop. The basic flow goes like this: 1. On SignalR connect, send the client a message GetDimensions that the client acts on. 2. When client receives GetDimensions, call C# service class that imports JS module 3. C# service class calls JS function to grab screen dimensions, await result 4. Return result as ValueTask<ScreenDimensions> from service class. 5. Call the SignalR hub SetScreenDimensions method with the return from the service class. My problem: This is working fine on Linux, but on Windows (using Edge and Chrome), the code I've noted with // THIS HANGS HERE won't run. I can see in teh JS console that I'm reaching that client method, but that call I'm awaiting hangs indefinitely. Code samples: Client Receive Method
hubConnection.On("GetDimensions", async () =>
{
var dimensions = await _screenInfo.GetDimensions(); // THIS HANGS HERE, does JS stuff
await hubConnection.SendAsync(
"CalculateDisplayArea",
dimensions.width,
dimensions.height,
0);
});
hubConnection.On("GetDimensions", async () =>
{
var dimensions = await _screenInfo.GetDimensions(); // THIS HANGS HERE, does JS stuff
await hubConnection.SendAsync(
"CalculateDisplayArea",
dimensions.width,
dimensions.height,
0);
});
ScreenInfo class method:
public async ValueTask<ScreenDimensions> GetDimensions()
{
if (_screenDimensions is not null)
{
return _screenDimensions;
}

// Load the module if null.
_module ??= await _js.InvokeAsync<IJSObjectReference>("import", _dbModulePath);

_screenDimensions = await _module.InvokeAsync<ScreenDimensions>("getDimensions");
return _screenDimensions;
}
public async ValueTask<ScreenDimensions> GetDimensions()
{
if (_screenDimensions is not null)
{
return _screenDimensions;
}

// Load the module if null.
_module ??= await _js.InvokeAsync<IJSObjectReference>("import", _dbModulePath);

_screenDimensions = await _module.InvokeAsync<ScreenDimensions>("getDimensions");
return _screenDimensions;
}
Anything glaringly wrong? I can't figure out why this call would work on Linux, but it would hang on Windows. dotnet version: 7.0.402
3 Replies
JakeWindle
JakeWindle7mo ago
there could be a different problem here though, as the Linux machine I run on is very beefy and the Windows machine is a normal laptop
mtreit
mtreit7mo ago
Sounds vaguely like a deadlock. I don't know anything about JS interop, but does adding ConfigureAwait(false) to your await statements help? As in:
await _js.InvokeAsync<IJSObjectReference>("import", _dbModulePath).ConfigureAwait(false);
await _js.InvokeAsync<IJSObjectReference>("import", _dbModulePath).ConfigureAwait(false);
JakeWindle
JakeWindle7mo ago
Tried that, and it didnt' help. I have isolated it to that service function I'm calling... I copied the code into a global JS function, and called that with the IJSRuntime instance rather than importing and calling a module, that unblocked me and now things are working... It has to be a deadlock, something about trying to import the module and invoke the module, while also answering a SignalR hub call... idk