如何处理“对象引用未设置为对象的实例”。在C#服务中

时间:2020-03-17 08:14:38

标签: c# .net-core blazor-client-side

你好堆栈溢出

我在缓慢加载页面方面遇到困难。我发现在Firefox的调试控制台中有一个错误No .NET call dispatcher has been set.,但是在Chrome浏览器中,我看到了一个更具体的错误:Error: System.NullReferenceException: Object reference not set to an instance of an object. at StudyMate.Client.Services.BrowserResizeService.OnBrowserResize ()

这里是my website。 如果在加载时打开浏览器控制台,有时您会自己看到这些错误,我发现它的再现性很强。请注意,第一次加载该页面要花一两分钟的时间,但是(假设您不清除浏览器缓存)在下次访问时页面加载会更快。

我的调整大小服务已注册为作用域,然后将其注入需要它的剃须刀页面中。在创建或销毁该剃刀页面/组件时,每个页面都有一个订户和处理方法。

这是C#浏览器调整大小服务文件,我遇到了问题,请注意,在剃须刀页面中,当事件发生时,我称为“获取尺寸”。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.JSInterop;
using StudyMate.Models.Models;

namespace StudyMate.Client.Services
{
    public class BrowserResizeService
    {
        private readonly IJSRuntime _JSRuntime;

        public event Func<Task> OnResize;

        private static BrowserResizeService _instance = null;
        public BrowserResizeService(IJSRuntime js)
        {
            _JSRuntime = js;
            _instance = this;
        }

        [JSInvokable]
        public static async Task OnBrowserResize()
        {
            await _instance?.OnResize?.Invoke();
        }

        public async Task<BrowserDimension> GetDimensions()
        {
            try
            {
                return await _JSRuntime.InvokeAsync<BrowserDimension>("getDimensions");
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex);
                return new BrowserDimension { Height = 800, Width = 1000 };
            }
            
        }
    }
}

以下是订阅该事件的剃须刀页面的示例:

@page "/ManageChosenSubjects"

@inject StudentService studentService
@inject SubjectService subjectService
@inject UserService userService
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject BrowserResizeService ResizeService

...

@code
{
    public int Height { get; set; }
    public int Width { get; set; }

...

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            ResizeService.OnResize += OnResize;
        }
    }

    private async Task OnResize()
    {
        await GetDimensions();
    }

    async Task GetDimensions()
    {
        var dimension = await ResizeService.GetDimensions();
        Height = dimension.Height - 220;
        Width = dimension.Width - 400;
        Console.WriteLine($"H: {Height}, W: {Width}");
        this.StateHasChanged();
    }

    public void Dispose()
    {
        ResizeService.OnResize -= OnResize;
    }
}

编辑:缩小C#服务文件的“对象引用未设置为对象实例”的问题。还是很困惑

0 个答案:

没有答案