2016-03-07 3 views
0

Тесты

У меня есть функция f1 (строка, строка), которая занимает 4 секунды, чтобы выполнить (не имеет значения, что он делает). Протестировали это, вызвав f1 («a», «b») в основном.C# Asynchronous Функция Резьбонарезной

Вызов

Console.WriteLine(f1("a", "b")); 
Console.WriteLine(f1("a", "b")); 

будет ждать 4 секунды для первой функции, чтобы закончить, подскажите возвращение, ждать еще 4 секунды, подскажите второй результат все прекрасно и денди.

Я пытался делать это параллельно, создавая два отдельных анонимных потоков с лямбда, как так:

new Thread(() => {Console.WriteLine(f1("a", "b")); }).Start(); 
new Thread(() => {Console.WriteLine(f1("a", "b")); }).Start(); 

Так как у меня двухъядерный процессор и функции обработки тяжелой (ОС сбалансирован это очень хорошо) У меня есть обе подсказки через 4 секунды (вместо 8), поэтому я знаю, что она работает параллельно.

Вопрос

Как я могу написать функцию f1Async (строка, строка), которая первоначально будет называть f1 (строка, строка), хотя и в другом потоке каждый раз (как я сделал вручную в основной)? Чтобы узнать, что будет выводить файл f1Async, я должен дождаться завершения потока, тем самым вызывая f1Async() два раза подряд, приведет к тому, что функция ожидает завершения одного потока, прежде чем переходить ко второму вызову.

+0

Вау, держитесь там, прежде чем рисковать прочь в земле многопоточности, то лучше сначала знать основы ... Получить книгу, найти учебник или что-то, вы не сможете обойтись без него. –

+0

Можете ли вы уточнить? Я не вижу ничего ужасного в этом вопросе и сам по себе. – Ilhan

ответ

1

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

Если вы хотите запускать f1 два раза асинхронно, прежде чем продолжить:

Parallel.For(0, 2, i => Console.WriteLine(f1("a", "b"))); 

Имейте в виду, что асинхронный вывод данных может привести к беспорядочных данных. Вы должны, вероятно, lock ваш Console.WriteLine для безопасности потока:

object synchro = new object(); 
Parallel.For(0, 2, i => 
{ 
    var output = f1("a", "b"); 
    lock (synchro) 
    { 
     Console.WriteLine(output); 
    } 
}); 
+0

Элегантный, ясный и просто блестящий ответ. Я даже не знал о существовании такой вещи, как Parallel.For. Проблема, которую я опубликовала, была значительно упрощена, но я чувствовал, что просто пропустил какого-то механика, чтобы разобраться. Спасибо, хорошо заработал upvote :)! – Ilhan

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