Как управлять потоками в веб-приложении C#?

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

Есть ли простой способ сделать что-то подобное?


person Biff MaGriff    schedule 06.01.2011    source источник


Ответы (3)


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

Таким образом, наиболее очевидный путь — выполнить эту работу в веб-сервисе. Вы можете заставить метод возвращать фрагмент HTML, если хотите. Вы также можете добавить методы состояния, чтобы увидеть, как продвигается поток.

person John Fisher    schedule 06.01.2011
comment
Итак, я поместил код обновления БД в WebService. Как бы я потреблял это? Javascript на клиенте или событие OnClick на сервере? - person Biff MaGriff; 07.01.2011
comment
Метод JQuery ajax работает хорошо, если вы разрабатываете веб-метод для работы с JSON (это очень легко сделать). Постбэки и панели обновлений могут работать очень медленно, если вы не будете осторожны, поэтому я настоятельно предпочитаю javascript, когда это возможно. - person John Fisher; 07.01.2011

Другие варианты включают в себя: передачу интенсивной обработки серверу базы данных (звучит так, как будто это может быть хорошим использованием OLAP) или другой дешевый трюк может состоять в том, чтобы настроить щелчок для запуска запланированной задачи, которая выполняется на сервере. Можете ли вы предоставить некоторые дополнительные сведения об окружающей среде? Один сервер? Платформа хранения данных, версия .net?

person jbehren    schedule 06.01.2011
comment
По сути, данные хранятся в беспорядке на нескольких экземплярах Oracle и в некоторых CSV-файлах на общем диске. В настоящее время у меня есть приложение командной строки C # (которое работает на моем локальном компьютере), которое берет все данные из этих источников, очищает их и помещает в рудиментарную звездную схему на отдельном сервере SQL 2005. Веб-сервер .Net 3.5. У меня нет доступа к серверу, на котором размещен SQLServer или сервер Oracle. - person Biff MaGriff; 07.01.2011
comment
У вас есть некоторый доступ к серверам БД, так как вы можете получить данные :) Однако, поскольку они, вероятно, не позволят создать пакет SSIS или SP, лучше всего настроить щелкните, чтобы запустить приложение командной строки. Или преобразовать его в службу, которая принимает команды (может быть даже служба WCF, хотя я этого не рекомендую) - person jbehren; 07.01.2011

Хорошо, я не использовал ни один ответ, поэтому вот что я сделал. Я решил, что будет лучше, если последующие клики завершатся, а не текущий. Спасибо за ваши ответы, ребята.

//code behind
protected void butRefreshData_Click(object sender, EventArgs e)
{
    Thread t = new Thread(new ThreadStart(DataRepopulater.DataRepopulater.RepopulateDatabase));
    t.Start();       
}

//DataRepopulater.cs
namespace DataRepopulater
{
    public static class DataRepopulater
    {
    private static string myLock = "My Lock";
    public static void RepopulateDatabase()
    {
        if(Monitor.TryEnter(myLock))
        {
            DoWork();
            Monitor.Exit(myLock);
        }
    }
}
person Biff MaGriff    schedule 07.01.2011