2013-05-04 3 views
1

В настоящее время я пытаюсь сделать некоторую оптимизацию производительности, используя Tasks, чтобы воспользоваться параллельной потоковой обработкой в ​​.NET 4.0.Понимание поведения System.Threading.Tasks

Я создал три метода, которые возвращают коллекции некоторых объектов или просто объекта. Позволяет называть их MethodA, MethodB и MethodC.

Внутри методаB У меня длинная задержка - примерно 5-7 секунд.

var person = new Person(); 

person.A = Task.Factory.StartNew(() => Mystatic.MethodA()).Result; 
person.B = Task.Factory.StartNew(() => Mystatic.MethodB()).Result; 
person.C = Task.Factory.StartNew(() => Mystatic.MethodC()).Result; 

Теперь я ожидаю свойства person.A и person.C быть установлены/заполняться прежде, чем person.B, но у меня есть трудности тестирования/отладки это проверить мои предположения.

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

Также это правильный способ для меня оптимизировать несколько вызовов методам, если я заполняю основной объект?

В моем случае у меня есть 5-7 различных методов для сбора данных, и я хотел бы сделать их параллельными, поскольку некоторые из них относительно трудоемки.

+1

Sidenote: просто напишите 'Task.Factory.StartNew'. – usr

+0

Ницца - это намного проще :) – codingjoe

ответ

1

Ваше предположение неверно. Свойство Задачи Result будет эффективно ждать завершения задачи, поэтому в этой последовательности будут назначены A, B, C. Кроме того, это приведет к поражению цели создания асинхронных задач.

Один из способов вы можете использовать Task.WaitAll на все три задачах, а затем присвоить результат от каждой задачи к A, B, C

вы также можете использовать асинхронный/Await, если у вас есть VS2012 - вы все еще можете предназначаться .NET 4.0 с помощью http://nuget.org/packages/Microsoft.Bcl.Async/

Однако понять, что асинхронная/Await не запускается 3 задачи параллельно, если вы сделаете это:

person.A = await Task.Run(() => Mystatic.MethodA()); 
person.B = await Task.Run(() => Mystatic.MethodB()); 
person.C = await Task.Run(() => Mystatic.MethodC()); 

это все еще будет последовательным - если вы хотите, параллельное выполнение до некоторой степени вы можете сделать это:

+0

Да, я получил эту часть, объясненную коллегой. Моя забота заключалась в том, что отдельные потоки работали параллельно и не последовательный. – codingjoe

4

Опираясь на хронометраж, багги по принципу, потому что тайминги никогда не гарантируются, особенно при реальных условиях слова. Вы должны подать надлежащее в ожидании по задачам, если вам нужно убедиться, что они были выполнены. Или используйте асинхронный ожидания C# 5.0 или продолжения.

Короче говоря, не программируйте по совпадению. Сделайте свои программы правильными по конструкции.

+0

+1. В качестве побочного элемента, если объект нуждается в длительной инициализации после создания, я бы включил «public static Task CreateAsync()» и (возможно) сделать конструктор закрытым. Но я отвлекаюсь :) –

+0

Это правильный ответ. Но если вы действительно хотите проверить свои подозрения с помощью отладчика (также сомнительная практика), вы можете просто сделать простой Debug.Write в каждом из наборов свойств или, возможно, просто установить контрольную точку в каждом сеттере. – Gjeltema

+0

Отладка Я хотел сделать часы на каждом из свойств и установить точку останова в конце области и следить за часами. Я бы постарался поэкспериментировать с await/async, но это не в рамочной рабочей версии, которую я сейчас использую :( – codingjoe

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