2009-06-04 1 views
0

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

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

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

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

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

EDIT На основе замечаний KM в

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

Задачи таблица:

 
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% завершено), и оставьте сообщение для них, сообщив им такие

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

+0

информацию о том, как присоединить сообщения к задаче –

+0

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

ответ

1

заменить петлю с этим:

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

Человек, это так близко! Но поле Receiver в таблице Messages должно быть идентификатором ресурса, а не идентификатором задачи. Я исправил инструкцию Insert, чтобы быть тем, что мне нужно, но я не могу понять, как исправить оператор Delete –

3

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

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

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

+0

+1, потому что рабочий процесс IIS может умереть в любое время, а работа фонового потока будет потеряна. – Greg

0

Кроме того, не закручивая от воздействия потока на другие веб- приложений на одном сервере?

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

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

Смежные вопросы