2013-03-14 2 views
2

Все -Какой вариант использования многопоточности C#

Больше вопросов о подходе. У меня есть веб-служба, которой мне нужен тест производительности с клиентской машины. Поэтому, по сути, я пишу быстрое многопоточное приложение WPF (в котором есть датчик/спидометр), чтобы визуально указать время запроса/ответа. Event-driven - поэтому, когда я нажимаю кнопку - приложение начнет делать запросы. Меня беспокоит только то, сколько времени потребовалось для запроса/ответа, а не самого значения resposne (пока).

Вот моя мысль-процесс в настоящее время:

1) Мне нужно создать столько потоков, сколько я могу (который мой клиент машина может обрабатывать) и измерить производительность. 2 варианта, которые я могу придумать - создание нового механизма Thread (так что я полностью контролирую поток) или используя механизм backgroundworker (поэтому я могу передать это значение из фоновой обработки обратно в пользовательский интерфейс). Успение - придется прокручивать код создания потока, поэтому может поддерживать создание нескольких потоков для обоих подходов.

2) не нужен никакой прогресс отчетность и, следовательно, не критерии выбора многопоточного подхода

3) Есть ли нужен метод обратного вызова - потому что должно передать обратно значение (время, необходимое для запроса/ответ на webservice)

4) Когда я обновляю переменную со значением - будет использовать любой из доступных методов синхронизации.

5) Havent действительно использовал API-интерфейс задачи из рамки 4.0, но это то, что я должен рассмотреть.

Отличается ли вышеуказанная линия подхода - или я что-то упускаю?

Действительно оцените любую помощь !!!

+4

Да, да и да еще раз для задач!Задачи изумительны, задачи этой задачи - всего лишь простая петля PLINQ, создающая веб-запросы и ожидающая ответов. –

+0

@BenjaminGruenbaum +1 для PLINQ. Я использовал его несколько раз, и это очень легко и удобно для такого рода вещей. –

+0

полностью согласен с @BenjaminGruenbaum –

ответ

1

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

int errorCount = 0; 

void Run() 
{ 
    Thread t = new Thread(delegate() 
    { 
     try 
     { 
      // your code 
     } 
     catch (Exception) 
     { 
      Interlocked.Increment(ref errorCount); 
     } 
    }); 
} 

С другой стороны, задачи имеют более контролируемый способ борьбы с ошибками - они бросают их, завернутые в AggregateException, когда вы вызываете функцию Task.Wait.

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

Parallel.ForEach, вероятно, стоит посмотреть на это, но, честно говоря, поскольку вы пытаетесь провести стресс-тест, а не сценарий реального мира, я мог бы избежать этого, чтобы убедиться, сколько потоков я запускаю сразу - я полагают, что материал PLINQ выполняет некоторую балансировку нагрузки на стороне клиента.

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

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

+1

Задачи намного больше, чем просто потоки. Эрик Липперт сделал это ясно в своем блоге несколько раз. Когда вы запускаете задачу, она может не запускать поток (например, вместо него может использоваться событие. Например, в контексте HTTP-запросов подход, основанный на событиях, может быть намного лучше, чем потоковый подход. –

+0

Это стоит знать. Можете ли вы предоставить ссылки? –

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