2013-06-06 3 views
2

У меня есть группа веб-сервисов, которые попадают 2 000 000 раз в день; 7 веб-сервисов. Каждая служба в настоящее время переносит входящее XML-сообщение на диск (это большой диск).Webservice - Threading vs Асинхронный вызов метода

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

Я использую .NET 2.0 и подумал о двух способах этого: асинхронный метод вызова метода DropMessage() или запуск нового потока и его вызов.

private void DumpMessage()// this method dumps the incoming message to File. 

DumpMessages управляет собственным делом. Если он терпит неудачу, он знает, что делать и как связаться с моей командой.

public delegate void AsyncDumpMessage(); 
AsyncDumpMessage caller = new AsyncDumpMessage(DumpMessage); 
IAsyncResult result = caller.BeginInvoke(null, null); 

против

System.Threading.Thread t = new System.Threading.Thread(DumpMessage); 
t.Start(); 

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

Любые другие идеи для лучшего способа сделать это? Для меня важны производительность и стабильность.

+1

Почему вы используете .NET 2.0 в отличие от 4.0, который имеет больше возможностей для управления потоками (в виде TPL) или .NET 4.5 (что добавляет еще больше опций для асинхронности)? –

+0

Добро пожаловать в программное обеспечение для предприятий ... Вам не нужно говорить мне, что у 4.0/4.5 есть лучшие варианты управления потоками;) –

ответ

1

Я бы использовал ThreadPool.QueueUserWorkItem, чтобы запланировать эту работу.

Это будет использовать поток ThreadPool, который имеет меньше накладных расходов, чем запуск отдельного потока. Он также предлагает вызов метода «огонь и забвение», где асинхронный вызов делегата предполагает, что вы хотите использовать IAsyncResult.

В более современной версии рамки, я бы рекомендовал Task.Run, но это не будет работать в .NET 2.

+0

Хороший звонок - просто профилировал его. 00: 00: 00.0003153 - 500 Асинхронные звонки ... 00: 00: 00.0471381 - 500 Запросы на темы ... 00: 00: 00.0000065 - 500 ThreadPool.QueueUserWorkItem calls ... –

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