Должен ли каждый BeginInvoke сопровождаться EndInvoke?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
25
задан Community 23 May 2017 в 11:53
поделиться

3 ответа

Если в документации для интерфейса явно не указано иное, вы должны вызывать EndInvoke для каждого места, в котором вы вызываете BeginInvoke. Основная причина в том, что EndInvoke - это единственный раз, когда владелец может безопасно освободить определенные ресурсы, которые могут быть выделены для вызова BeginInvoke (например, WaitHandle).

Но есть исключения из этого правила. API, такие как Control.BeginInvoke, не требуют EndInvoke, но это явно указано в документации.

22
ответ дан 28 November 2019 в 21:28
поделиться

Оба верны - это разные вызовы.

В целом всегда следует вызывать EndInvoke , чтобы гарантировать, что любые ресурсы, полученные асинхронным вызовом, будут выпущен.

Однако группа разработчиков Windows Forms гарантирует, что вам не нужно делать это для Control.Invoke . Возможно, вам придется сделать это для других реализаций ISynchronizeInvoke , хотя

13
ответ дан 28 November 2019 в 21:28
поделиться

Раньше я использовал метод «запустил и забыл» с делегатами, когда результаты были «полезны, если доступны, но не требуются». Просто помните, что у вас нет гарантий завершения с этим методом. В частности, вот одно место, в котором я его использую:

  • Запуск делегата для проверки обновлений приложения
  • Делегат начинает веб-запрос с тайм-аутом
  • Если возникает ошибка / тайм-аут или если приложение работает - на сегодняшний день, метод просто возвращает
  • Если приложение устарело, я помещаю сообщение в системную область без перехвата фокуса, в котором говорится об этом (значок на панели задач отсутствует, если обновление не доступно)

В любом случае приложение продолжает работать бесперебойно.

1
ответ дан 28 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: