Хотите отменить подписку asyn c метод внутри Dispose функция Blazor - PullRequest
0 голосов
/ 27 февраля 2020

Я использую событие для передачи данных из одного частичного представления в другое в Blazor.

Проблема: удаление не работает, и каждый раз, когда страница уничтожается и перерисовывается, она присоединяет одно и то же событие. И когда я вызываю событие, оно вызывается несколько раз (это количество раз, когда частичное представление уничтожается и воссоздается)

Код определения события с методом вызова

public event Action<long,long,bool,bool> MyEvent;
public void InVokeMyEvent(long data1,
        bool data2,long data3,bool data4) {
        MyEvent?.Invoke(data1,data2,data3, data4);
    } 

Определение функции

async Task MyFunction(long data1,
        long data2,
        bool data3,
        bool data4)
{}

Я регистрирую событие в функции OnInitializedAsyn c следующим образом.

protected override async Task OnInitializedAsync()
{

    RGEState.MyEvent+= async (long data1,
       long data2,
       bool data3,
       bool data4) =>
   await MyFunction(data1,
        data2,
        data3,
        data4);

    await base.OnInitializedAsync();
}

Теперь, чтобы отсоединить событие, я выполняю следующий код на странице после реализации IDisposable.

public void Dispose()
{
    RGEState.MyEvent -= async (long data1,
       long data2,
       bool data3,
       bool data4) =>
   await MyFunction(data1,
        data2,
        data3,
        data4);
}

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

На этот вопрос здесь ответил Джон Скит Как удалить обработчик лямбда-события

В основном создайте делегата и используйте его для подписки / отмены подписки на событие.

Отредактировано, чтобы помочь оператору понять

Вот так: вам нужно хранить ссылку на свое выражение, чтобы при отписке он был одним и тем же делегатом.

private Action<long,long,bool,bool> _delegate;
protected override async Task OnInitializedAsync()
{

    _delegate = async (long data1,
       long data2,
       bool data3,
       bool data4) => await MyFunction(data1,
        data2,
        data3,
        data4);

    RGEState.MyEvent += _delegate;
    await base.OnInitializedAsync();
}

public void Dispose()
{
    RGEState.MyEvent -= _delegate;
}
1 голос
/ 27 февраля 2020

Я не уверен, что понимаю, в чем проблема. Такое поведение предусмотрено при разработке ... Когда создается ваш компонент, выполняется метод OnInitializedAsyn c, который подключает обработчик события к событию MyEvent. Когда компонент уничтожен, обработчик события отсоединяется. Если ваш компонент воссоздан, описанный выше процесс повторяется снова ... и снова. Вы хотите, чтобы обработчик событий был добавлен только один раз? Это то, что вы хотите ? Возможно, вам следует спроектировать компоненты по-другому.

Однако, возможно, реализация объекта CircuitHandler может решить вашу проблему, поскольку это касается жизненного цикла соединения Circuit. Смотрите мой ответ здесь, как это сделать ...

0 голосов
/ 27 февраля 2020

См. Следующий пример

Согласно приведенной выше ссылке, я сделал функцию "MyFunction" syn c и вызвал другую асинхронную c функцию внутри нее для загрузчика

* 1006. *
...