Многопоточность с параметром [duplicate]

Краткий ответ: ваш метод foo() возвращается немедленно, а вызов $ajax() выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.

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

function foo(result) {
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;   // Store the async result
        }
    });
}

var result = { response: null };   // Object to hold the async result
foo(result);                       // Returns before the async completes

Обратите внимание, что вызов foo() ] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response.

4
задан Maadh 11 November 2014 в 10:23
поделиться

3 ответа

См. превосходное сообщение в блоге Эрика Липперта по этой проблеме.

Это вызвано доступом к «измененному закрытию» .

Измените тело вашего цикла на это:

for (int i = 1; i<=3; i++)
{
    int j = i;  // Prevent use of modified closure.
    Thread thread = new Thread(() => testThread("" + j + "__"));

    thread.Start();
}

(Обратите внимание, что для цикла foreach это было исправлено в .Net 4.5, но оно НЕ было исправлено для цикла for .)

11
ответ дан Community 25 August 2018 в 14:36
поделиться

testThread не вызывается при создании объектов Thread в цикле for - метод вызывается всякий раз, когда запускается поток. И это может произойти позже.

В вашем случае потоки начали работать после завершения цикла for - к тому времени i было равно 3. Таким образом, testThread вызывается 3 раза со значением 3.

0
ответ дан dcastro 25 August 2018 в 14:36
поделиться

Закрытие. Вы должны в значительной степени скопировать переменную в потоке, чтобы она сохраняла текущее значение.

Уайт теперь все потоки читают переменную i с любым значением, которое они имеют в момент их запуска - НЕ со значением it когда было вызвано thread.start.

3
ответ дан TomTom 25 August 2018 в 14:36
поделиться
Другие вопросы по тегам:

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