Веб-сервис.NET и потоки BackgroundWorker

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

14
задан Cœur 31 December 2016 в 08:17
поделиться

3 ответа

BackgroundWorker полезно, когда необходимо синхронизироваться назад с (например), UI* поток, например, по причинам привязки. В этом случае казалось бы, что просто использование ThreadPool будет более, чем соответствующим (и намного более простым). Если у Вас есть большие объемы, то очередь производителя/потребителя может позволить лучшую регулировку (таким образом, Вы не тонете в потоках) - но я подозреваю ThreadPool, будет прекрасен здесь...

public void SendDataAsync()
{
    ThreadPool.QueueUserWorkItem(delegate
    {
        SendEmail();
    });
}

Также - я не совсем уверен, чего Вы хотите достигнуть путем сна? Это просто свяжет поток (не использующий ЦП, но делающий отрицательный результат ни один). Хотеть уточнить? Это взгляды как Вы приостанавливают Вашу фактическую веб-страницу (т.е. Сон происходит на потоке веб-страницы, не почтовом потоке). Что Вы пытаетесь сделать здесь?

* =actually, это будет использовать любой синхронизирующий контекст, существует

18
ответ дан 1 December 2019 в 13:22
поделиться

Это может разъединенный, потому что после 20 секунд, что экземпляр BackgroundWorker может быть собран "мусор", потому что это не имеет никаких ссылок (вышедший объем).

0
ответ дан 1 December 2019 в 13:22
поделиться

Производитель/потребитель Re; в основном - это просто стоит сохранить приблизительно вид дросселя. На самом простом уровне, Semaphore мог использоваться (вместе с постоянным клиентом ThreadPool) для ограничения вещей известным объемом работы (чтобы не насыщать пул потоков); но очередь производителя/потребителя, вероятно, была бы более эффективной и управляемой.

у Jon Skeet есть такая очередь здесь (CustomThreadPool). Я мог, вероятно, написать некоторые записки об этом, если бы Вы хотели.

, Который сказал: если Вы - отмена к внешнему веб-сайту, довольно вероятно, что у Вас будет много из, ожидает в сети IO / порты завершения; как таковой, у Вас может быть немного более высокое количество потоков..., очевидно (в отличие от этого), если работа была зависящей от ЦП, нет никакого смысла имеющего больше потоков, чем у Вас есть ядра процессора.

1
ответ дан 1 December 2019 в 13:22
поделиться
Другие вопросы по тегам:

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