2013-06-03 2 views
2

У меня есть огромные данные для запуска, которые занимают очень много времени, поэтому подумал, что Threading может быстро выполнить эту работу для меня.Asp.net - многопоточность в C#

Что я делаю: вызов SQL хранимых процедур из интерфейса ASP.NET и обработка происходит там, и это занимает почти 30 часов.

Что мне нужно: я разделил данные на разные партии и создал соответствующие SP для каждого. Теперь мне нужно, чтобы все SP были запущены одновременно одним щелчком мыши.

Пожалуйста, помогите!

Я использовал приведенный ниже код, но он, похоже, не работает параллельно.

protected void Button3_Click(object sender, EventArgs e) 
    { 
     Thread t1 = new Thread(Method1); 
     Thread t2 = new Thread(Method2); 

     t1.Start(); 
     t2.Start(); 

     t1.Join(); 
     t2.Join(); 

    } 
    void Method1() 
    { 
     for (int i = 0; i < 10000; i++) 
     { 
      Response.Write("hello1"+i); 
      Response.Write("<br>"); 
     } 
    } 

    void Method2() 
    { 
     for (int i = 0; i < 10000; i++) 
     { 
      Response.Write("hello2" + i); 

     } 
    } 
+4

Конвейер ASP.Net работает в одном потоке и умирает после завершения окончательного рендеринга.В основном это означает, что страницы остаются в живых на сервере, но эти страницы создаются для каждого запроса, используемые для генерации полученного html, а затем освобождаются. Перед тем, как продолжить, ознакомьтесь с документацией, чтобы понять эту модель. Существуют решения (приложение signalR + out-of-iis), но вы должны знать, как работает asp.net вообще раньше. –

+0

Когда вы вызываете 't1.Join', вы сообщаете текущему потоку дождаться завершения t1, поэтому код не работает параллельно – stuartd

+0

Написание 20 000 статей на страницу ASP.NET? Разве вы не хотели бы разбивать страницы или что-то еще? –

ответ

5

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

Также обратите внимание, что у SqlConnection и т. Д. Также есть свои собственные временные рамки.

Что нужно делать, это в очередь на работу (с использованием IPC или другой таблицы базы данных и т. Д.) И иметь что-то вроде службы Windows или внешнего процесса в запланированной задаче, которая забирает и обрабатывает очередь.

Черт, вы даже можете начать работу в SQL Server и выполнить эту работу напрямую.

+0

Спасибо @Lloyd за ваш ответ. Не могли бы вы предложить мне какое-нибудь сообщение в блоге или любую статью для решения, которое вы мне дали? –

1
  • Threading не волшебным образом ускоряет ваш процесс.
  • Если вы не знаете, что вы делаете на стороне сервера, это не очень хорошая идея в целом.
  • сервер Sql вероятно будет тайм-аут для 30hrs :)

за 30 часов работы Asp.net не путь. Это большой процесс, и вы не должны обрабатывать его в Asp.net. В качестве альтернативы вы можете написать службу Windows. Передайте свои параметры (возможно, с msmq или какой-то системой обмена сообщениями). Выполняйте ваш процесс и отправляйте прогресс в веб-приложение, показываете его с помощью сигналов signalR или ajax.

1

Narendran, начало здесь:

http://www.albahari.com/threading/

Это лучший учебник Резьбонарезной я видел в Интернете, и соответствующая книга тоже очень хорошо.

Убедитесь, что вы провели достаточно времени, чтобы пройти весь учебник (я сделал это и поверю, он того стоит!).

Как было сказано выше, метод Join класса Thread в этом случае поражает цель использования потоков. Вместо того, чтобы использовать блокировку использования соединения (см. Базовую синхронизацию в приведенном выше руководстве), чтобы убедиться, что потоки синхронизированы.

Также, как уже упоминалось, перед выполнением многопоточности Запустите эти хранимые процедуры на SQL-сервере напрямую и все вместе. Если для выполнения этого еще требуется 30 часов, то использование Threading не поможет. Если вы видите менее 30 часов, вы можете получить выгоду от многопоточности.

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