JakeWindle
JakeWindle
CC#
Created by JakeWindle on 11/13/2023 in #help
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
6 replies