Порядок выполнения тасков?

289
17 мая 2017, 04:56

Здравствуйте, имеется вот такой код:

Task.Factory.StartNew(()=>Method(a));
Method(b);

Объясните пожалуйста, как так получается, что иногда Method(b) начинает выполняться раньше, чем Method(a)? Method() начинается с lock()

И в случае:

Task.Factory.StartNew(()=>Method(a));
Task.Factory.StartNew(()=>Method(b));

Есть гарантия что они запустятся последовательно? Т.е. сначала точно начнет выполняться Method(a), а следом Method(b)? И если нет, то как правильно сделать?

Answer 1

Нет никакой гарантии. Запуститься может даже 5-ый таск первым. Если хотите точный запуск по очереди - вызывайте новый поток "матрешкой" при старте предыдущего.

UPD: @PavelMayorov предлагает использовать await и TaskCompletionSource.

Answer 2

Task ставится планировщиком в очередь на выполнение и обещает когда-нибудь выполниться, но запуск прямо сейчас не гарантируется, например нету не одного свободного потока в пуле => запуск может быть совершенно в произвольном порядке.

READ ALSO
Отслеживаем мышь и клавиатуру

Отслеживаем мышь и клавиатуру

Задача такая: если пользователь в течении пяти минут не трогал клавиатуру и мышь (не нажимал кнопки и не двигал курсором) запускать приложениеПричем...

352
DataGridView заполняется пустыми строками

DataGridView заполняется пустыми строками

Пытаюсь заполнить DataGridView в форме значениями из списка:

332
Зацикливает вывод продуктов

Зацикливает вывод продуктов

Продукты и название выводятся, но вместо 30 их выводится пару сотен Что в коде не так?

412