Фоновая многопоточность в ASP.NET и влияние на производительность - PullRequest
0 голосов
/ 04 июня 2009

Мой текущий сайт настроен так, чтобы оставлять сообщения определенным людям при первом входе в приложение. Количество оставшихся сообщений может быть от 1000 до 10000, каждое из которых является запросом, а все запросы - в операторе транзакции.

Да, я знаю, что это похоже на плохой дизайн, это не мой вопрос.

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

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

Мой вопрос заключается в том, решает ли проблема простое выделение нового потока для обработки этого процесса (т. Е. Разрешить ли пользователю работать, пока доставитель оставляет сообщения)? Кроме того, влияет ли выделение потока на другие веб-приложения на том же сервере?

РЕДАКТИРОВАТЬ На основе комментариев КМ

Упрощенные схемы:

Таблица задач:

TaskID        StartDate         EndDate       PercentComplete
TSK1          4/17/09           5/17/09       60
TSK2          3/19/09           3/29/09       80
TSK3          1/1/08            2/9/09        100

Таблица назначений:

TaskID        ResourceID
TSK1          111
TSK1          222
TSK2          222
TSK2          333
TSK2          444
TSK3          111
TSK3          333

Схема таблицы сообщений:

Subject       Receiver       Sender        Content
Overdue Task  111            000           Task TSK1 is overdue.
Overdue Task  222            000           Task TSK1 is overdue.
Overdue Task  222            000           Task TSK2 is overdue.
Overdue Task  333            000           Task TSK2 is overdue.
Overdue Task  444            000           Task TSK2 is overdue.

Таким образом, код получит всех людей, назначенных для просроченной задачи (т.е. EndDate ранее, чем сегодня, и! = 100% выполнено), и оставит сообщение для них, сообщающее им

Я думаю, что реальная проблема заключается в том, что я использую запрос на выборку, чтобы получить людей, назначенных для просроченных задач, из базы данных, а затем использую код C # для составления сообщений и транзакций перед вызовом базы данных для вставки сообщений.

Ответы [ 3 ]

3 голосов
/ 04 июня 2009

Вы можете делегировать работу фоновому потоку. Создайте функцию для выполнения работы и запустите ее следующим образом:

new Thread(
    () => SendALotOfMessagesByBadDesign(par1)
    ).Start();

Перезапуск IIS или переработка пула приложений приведет к прерыванию фонового потока, но это также происходит в вашем текущем решении.

1 голос
/ 04 июня 2009

замените ваш цикл следующим:

BEGIN TRANSACTION

INSERT INTO Messages 
        (Subject, Receiver, Sender, Content)
    SELECT
        'Overdue Task', t.TaskID, '000', 'Task '+CONVERT(varchar,t.TaskID)+' is overdue.'
        FROM Tasks                    t
            INNER JOIN Assignments    a ON t.TaskID=a.TaskID
            LEFT OUTER JOIN Messages  m ON t.TaskID=m.Receiver
        WHERE t.EndDate<GETDATE() AND PercentComplete<100
            AND m.Receiver IS NULL

DELETE Messages
    FROM Messages
        INNER JOIN Tasks  ON Messages.Receiver=Tasks.TaskID AND PercentComplete=100

COMMIT

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

EDIT
поскольку вы не можете присоединить сообщение к задаче, вы не можете выполнить удаление, как у меня выше. Если у вас нет времени на столбец EndDate, вы можете запустить его как задание SQL Server сразу после полуночи, так как часть этого задания сначала усекает таблицу, а затем вставляет то, что необходимо. Я бы удостоверился, что вы удаляете сообщения, когда задача отмечена как 100 выполненных

0 голосов
/ 04 июня 2009

Также крутится не в силах повлиять на другую сеть приложения на одном сервере?

Предполагая, что веб-сервер имеет несколько процессоров, я полагаю, что вы можете назначить это веб-приложение его собственному пулу приложений и установить привязку к определенному процессору, чтобы ограничить влияние на другие веб-приложения. http://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/cpu

Я никогда не делал этого, я просто выбрасывал это как "в рамках возможностей". Я не знаю, желательно это или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...