Выполнение асинхронной операции инициировано запросом веб-страницы ASP.NET

Это очень возможно, но без дополнительных библиотек, таких как Reflections, это сложно ... Это сложно, потому что у вас нет полного инструмента для получения имени класса. И я беру код моего класса ClassFinder:

package play.util;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/**
 * Created by LINKOR on 26.05.2017 in 15:12.
 * Date: 2017.05.26
 */
public class FileClassFinder {
private JarFile file;
private boolean trouble;
public FileClassFinder(String filePath) {
    try {
        file = new JarFile(filePath);
    } catch (IOException e) {
        trouble = true;
    }
}

public List<String> findClasses(String pkg) {
    ArrayList<String> classes = new ArrayList<>();
    Enumeration<JarEntry> entries = file.entries();
    while (entries.hasMoreElements()) {
        JarEntry cls = entries.nextElement();
        if (!cls.isDirectory()) {
            String fileName = cls.getName();
            String className = fileName.replaceAll("/",         ".").replaceAll(File.pathSeparator, ".").substring(0, fileName.lastIndexOf('.'));
            if (className.startsWith(pkg)) classes.add(className.substring(pkg.length() + 1));
        }
    }
    return classes;
}
}
53
задан Damovisa 23 March 2009 в 05:16
поделиться

2 ответа

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

private delegate void DoStuff(); //delegate for the action

protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click(object sender, EventArgs e)
{
    //create the delegate
    DoStuff myAction = new DoStuff(SomeVeryLongAction); 
    //invoke it asynchrnously, control passes to next statement
    myAction.BeginInvoke(null, null);
    Button1.Text = DateTime.Now.ToString();
}


private void SomeVeryLongAction()
{
    for (int i = 0; i < 100; i++)
    {
        //simulation of some VERY long job
        System.Threading.Thread.Sleep(100);
    }
}
31
ответ дан Ilya Tchivilev 7 November 2019 в 18:42
поделиться

Хорошо, вот проблема: Асинхронный атрибут для случая, куда Ваша страница собирается назвать некоторую продолжительную задачу, которая также блокирует поток, и затем Вашей странице нужен вывод от той задачи, чтобы возвратить информацию пользователю. Например, если Ваша страница должна была назвать веб-сервис, ожидать его ответа и затем использовать данные из ответа для рендеринга страницы.

причина Вы использовали бы Асинхронный атрибут, должен постараться не блокировать поток. Это важно, потому что приложения ASP.NET используют пул потоков для обслуживания запросов, и существует только относительно небольшое количество доступных потоков. И если каждый вызов связывает поток при ожидании на вызове веб-сервиса, то скоро Вы собираетесь поразить достаточно параллельных пользователей, что пользователи оказываются перед необходимостью ожидать до этих завершенных вызовов веб-сервиса. Асинхронный атрибут позволяет потоку возвратиться к пулу потоков и служить другим параллельным посетителям Вашего веб-сайта, вместо того, чтобы вынудить его сидеть не двигаясь, ничего не делая, в то время как ожидание веб-сервиса призывает к возврату.

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

необходимо запустить собственный поток и сделать его потоком демона. Я не помню точный синтаксис за это, но можно легко найти его в документе путем поиска документа BCL "демона". Это означает, что поток помешает Вашему приложению закрываться, в то время как это живо, который важен, потому что ASP.NET и IIS оставляют за собой право "перерабатывать Ваш процесс", когда они считают это необходимым, и если это произойдет, в то время как Ваш поток работает, Ваша задача будет остановлена. Создание демона потока предотвратит это (за исключением некоторых возможных редких пограничных случаев... Вы узнаете больше при нахождении документации относительно этого).

, Что поток демона - то, где Вы начнете эти задачи. И после того, как Вы сказали потоку демона делать задачу, можно сразу представить страницу..., таким образом, рендеринг страницы сразу произойдет.

Еще лучше, чем поток демона в Вашем процессе ASP.NET, тем не менее, должен был бы реализовать службу Windows для того, чтобы сделать задачу. Имейте свое приложение ASP.NET, передают задачу, которая будет выполнена к Сервису. Никакая потребность в потоке демона и никакая потребность волноваться о Вашем перерабатываемом процессе ASP.NET. Как Вы говорите Сервису сделать задачу? Возможно, через WCF, или возможно путем вставки записи в таблицу базы данных, которую опрашивает Сервис. Или много других путей.

РЕДАКТИРОВАНИЕ: вот другая идея, которую я использовал прежде для этой точно той же цели. Запишите информацию о своей задаче в очередь MSMQ. Имейте другой процесс (возможно, даже на другой машине) получение по запросу от той очереди и сделайте трудоемкую задачу. Задание вставки в Очередь оптимизировано для возврата как можно быстрее, таким образом, поток не заблокируется, в то время как данные, Вы вставляете Очередь, отправляются через провод или что-либо как этот. Это - один из самых быстрых способов сделать примечание того, что задача должна быть сделана, не ожидая той задачи выполниться.

26
ответ дан Charlie Flowers 7 November 2019 в 18:42
поделиться
Другие вопросы по тегам:

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