ОШИБКА. Первое исключение исключения типа «System.Threading.ThreadAbortException» произошло в файле mscorlib.dll [duplicate]

Это описывает распространенную ошибку с использованием замыканий в JavaScript.

Функция определяет новую среду

. Рассмотрим:

function makeCounter()
{
  var obj = {counter: 0};
  return {
    inc: function(){obj.counter ++;},
    get: function(){return obj.counter;}
  };
}

counter1 = makeCounter();
counter2 = makeCounter();

counter1.inc();

alert(counter1.get()); // returns 1
alert(counter2.get()); // returns 0

Для каждого времени makeCounter, {counter: 0} приводит к созданию нового объекта. Кроме того, создается новая копия obj для ссылки на новый объект. Таким образом, counter1 и counter2 не зависят друг от друга.

Замыкания в циклах

Использование замыкания в цикле является сложным.

Рассмотрим:

var counters = [];

function makeCounters(num)
{
  for (var i = 0; i < num; i++)
  {
    var obj = {counter: 0};
    counters[i] = {
      inc: function(){obj.counter++;},
      get: function(){return obj.counter;}
    }; 
  }
}

makeCounters(2);

counters[0].inc();

alert(counters[0].get()); // returns 1
alert(counters[1].get()); // returns 1

Обратите внимание, что counters[0] и counters[1] независимы не . Фактически, они работают на одном и том же obj!

Это связано с тем, что есть только одна копия obj, разделенная на все итерации цикла, возможно, по соображениям производительности. Несмотря на то, что {counter: 0} создает новый объект на каждой итерации, одна и та же копия obj будет просто обновляться с ссылкой на самый новый объект.

Решение состоит в использовании другой вспомогательной функции:

function makeHelper(obj)
{
  return {
    inc: function(){obj.counter++;},
    get: function(){return obj.counter;}
  }; 
}

function makeCounters(num)
{
  for (var i = 0; i < num; i++)
  {
    var obj = {counter: 0};
    counters[i] = makeHelper(obj);
  }
}

Это работает, потому что локальные переменные в области функции напрямую, а также переменные аргументов функции выделяются новыми экземплярами при записи.

Подробное обсуждение см. в JavaScript ловушки закрытия и использование

2
задан John Ohara 18 May 2016 в 08:55
поделиться

2 ответа

, используя этот код

Response.Redirect(resp.RedirectUrl, false);
Context.ApplicationInstance.CompleteRequest();

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

Попробуйте использовать этот код, который остановит дальнейшее выполнение вашей программы

Response.Redirect(resp.RedirectUrl, false);
return;

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

relative Перенаправить на страницу с помощью endResponse для истинного VS CompleteRequest и защитного потока

2
ответ дан Community 4 September 2018 в 08:47
поделиться

Поскольку целевой URL-адрес получен от третьего лица, после сохранения их в базе данных. вы можете использовать «Sever.Transfer» вместо «Response.Redirect».

Response.Redirect может вызвать кругооборот, поэтому будет латентность.

Целевой URL будет обрабатываться другим доменным / веб-сервером, а не с вашего сервера приложений.

Так что Server.Transfer будет лучшим вариантом для этой операции перенаправления.

-1
ответ дан Vignesh_Dev 4 September 2018 в 08:47
поделиться
Другие вопросы по тегам:

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