Здравствуйте, имеется вот такой код:
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)? И если нет, то как правильно сделать?
Нет никакой гарантии. Запуститься может даже 5-ый таск первым. Если хотите точный запуск по очереди - вызывайте новый поток "матрешкой" при старте предыдущего.
UPD: @PavelMayorov предлагает использовать await и TaskCompletionSource.
Task ставится планировщиком в очередь на выполнение и обещает когда-нибудь выполниться, но запуск прямо сейчас не гарантируется, например нету не одного свободного потока в пуле => запуск может быть совершенно в произвольном порядке.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей