Interop Blazor互操作导致LOS溢出

Interop Blazor互操作导致LOS溢出,interop,overflow,blazor,Interop,Overflow,Blazor,我正在使用Blazor并使用interop定期使用window.SetInterval从javascript调用.NET方法 调用.NET方法会导致延迟,并在浏览器-调试中显示以下消息: 消息 WASM: GC_MAJOR_SWEEP: major size: 1232K in use: 836K blazor.webassembly.js:1 WASM: GC_MAJOR: (LOS overflow) time 76.10ms, stw 76.14ms los size: 24464K in

我正在使用
Blazor
并使用
interop
定期使用
window.SetInterval
javascript
调用
.NET
方法

调用
.NET
方法会导致延迟,并在浏览器-调试中显示以下消息:

消息

WASM: GC_MAJOR_SWEEP: major size: 1232K in use: 836K
blazor.webassembly.js:1 WASM: GC_MAJOR: (LOS overflow) time 76.10ms, stw 76.14ms los size: 24464K in use: 23455K
blazor.webassembly.js:1 WASM: GC_MINOR: (LOS overflow) time 19.33ms, stw 19.37ms promoted 0K major size: 1232K in use: 339K los size: 24464K in use: 23455K
js部分非常简单。我有一个
订阅
、一个
集合
和一个
清除
间隔方法,该方法将从
.net
调用

Js

window.methods={

subscription: null,

setInterval: function (interval) {
        if (this.subscription != null || this.subscription != undefined) {
            window.clearInterval(this.subscription);
        }
        subscription = window.setInterval(async function () {
            console.log("calling .net from js");
            await DotNet.invokeMethodAsync("Sms.Studio.Web.Client", "RefreshCallbackAsync");
        }, interval);

    },

clearInterval: function () {
        if (subscription == null || subscription == undefined) {
            return;
        }
        console.log("Clearing subscription");
        window.clearInterval(subscription);
    }
}
.Net
中,我有一个启动
SetInterval
的方法和一个
jsinvokable
方法。这个可调用的方法启动我在组件中订阅的事件

组件

private bool shouldRefresh;
[Parameter] protected bool ShouldRefresh {
        get {
            return this.shouldRefresh;
        }
        set {
             ManageSubscription(value);

        }
    }

public delegate Task OnRefresh();
public static event OnRefresh JSCalledRefresh;

[JSInvokable("RefreshCallbackAsync")]
public static async Task RefreshAsync() {
  Console.WriteLine("Invoked event");
  JSCalledRefresh?.Invoke();

        }

private  void ManageSubscription(bool value) {
  if (this.shouldRefresh == value) {
     return;
  }
  if(this.shouldRefresh==false && value == true) {
     JSMethods.SetInterval(INTERVAL);
     JSCalledRefresh += SubscribeMethod;     
  }
  else if(this.shouldRefresh==true && value == false) {
     JSMethods.ClearInterval();
     JSCalledRefresh -=SubscribeMethod; 
  }
  this.shouldRefresh = value;
}
基本上,我所做的是我有一个
[参数]bool ShouldRefresh
,当它改变值时,我通过
js interop
设置订阅
设置订阅。当订阅被设置时
jsinvokable
方法也将向父组件发布事件


p.S如果我停止从js调用
jsinvokable
方法,我将停止获得延迟和溢出消息。

@Bercovici Adrian,您的代码不完整。假设第一次呈现子组件时,分配给ShouldRefresh的值等于true:调用window.methods.setInterval方法,该方法将回调触发事件JSCalledRefresh的C#RefreshCallbackAsync方法。。。我没有看到任何代码将false赋值给JSCalledRefresh,从而启动对window.methods.clearInterval的调用。。。因此,window.methods.setInterval将无休止地执行,并一次又一次地调用RefreshCallbackAsync方法。也许,这就是例外的原因


希望这有帮助……

你到底为什么要这样做?您是否只是从javascript ping C#以确保连接正常工作?间隔包含什么值?为什么clearInterval除了一遍又一遍地调用自己之外什么都不做?用例如下:我在用
setInterval
模拟websocket连接,我以后需要它。用户按下父组件上的按钮,打开一个
模式
,该模式通过
ws
更新。该模式的生存期
subscription
由父组件控制。
ShouldRefresh
从父组件重置。正如您所看到的,它被定义为一个
[参数]
。我要做的是,父组件控制
子组件中循环的生存期。