Blazor Interop导致LOS溢出

时间:2019-03-28 09:17:16

标签: interop overflow blazor

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

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

消息

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部分非常简单。我有一个subscription,一个set和一个clear区间方法,将从.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和一个method的{​​{1}}的方法。此可调用方法启动一个事件,我在组件中订阅了该事件。

组件

JSInvokeable

基本上我在做什么是我有一个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; } ,当它通过[Parameter] bool ShouldRefresh的{​​{1}}或clear订阅改变值时。设置订阅时, set方法还将事件发布到父组件。

PS 如果我停止从js调用js interop方法,我将停止获取延迟和溢出消息。

1 个答案:

答案 0 :(得分:2)

@Bercovici Adrian,您的代码不完整。假设第一次渲染您的子组件,并且分配给ShouldRefresh的值等于true:window.methods.setInterval方法被调用,它将回调触发事件JSCalledRefresh的C#RefreshCallbackAsync方法。看到为JSCalledRefresh分配false的任何代码,从而启动对window.methods.clearInterval ...的调用。结果,window.methods.setInterval被无限执行,一次又一次地调用RefreshCallbackAsync方法。也许,这是导致异常的原因。

希望这对您有帮助...