Здравствуйте, #John, Вы писали:
J>Так работает. Почему в случаи `tasks.Add(Task.Factory.StartNew())` SemaphoreSlim(1,1) WaitAsync не работает как lock?
balace-- атомарная. Даже если lock не работает ты должен получить 0.
Но вот все ли задачи запустились? Проверь общее колчество balace-- и balace++
и солнце б утром не вставало, когда бы не было меня
J>Так работает. Почему в случаи `tasks.Add(Task.Factory.StartNew())` SemaphoreSlim(1,1) WaitAsync не работает как lock?
SemaphoreSlim работает как должен. Просто ты ожидаешь не те таски. Task.Factory.StartNew(...) возвращает Task<Task> для асинхронных делегатов, поэтому нужен еще один await или Unwrap(). Подробнее
Does not understand async delegates. This is actually the same as point 1 in the reasons why you would want to use StartNew. The problem is that when you pass an async delegate to StartNew, it’s natural to assume that the returned task represents that delegate. However, since StartNew does not understand async delegates, what that task actually represents is just the beginning of that delegate. This is one of the first pitfalls that coders encounter when using StartNew in async code.
и await Task.WhenAll(tasks); поэтому "преждевременно" завершается
сам s.WaitAsync работает как должен,
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, #John, Вы писали:
J>>Так работает. Почему в случаи `tasks.Add(Task.Factory.StartNew())` SemaphoreSlim(1,1) WaitAsync не работает как lock?
S>balace-- атомарная. Даже если lock не работает ты должен получить 0.
balace-- — не атомарная операция.
S>Но вот все ли задачи запустились? Проверь общее колчество balace-- и balace++
Да, похоже в этом была ошибка.
Підтримати Україну у боротьбі з країною-терористом.
Здравствуйте, Serginio1, Вы писали:
J>>Так работает. Почему в случаи `tasks.Add(Task.Factory.StartNew())` SemaphoreSlim(1,1) WaitAsync не работает как lock? S>balace-- атомарная.
А назвали бы в Майкрософте метод как положено Task.Factory.StartNewAsync, глядишь и темы этой не было бы.
Я сам уже думал, что чудеса какие-то и в глаза это не бросилось, т.к. обычно через Task.Run запускаю задачи )
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Serginio1, Вы писали:
J>>>Так работает. Почему в случаи `tasks.Add(Task.Factory.StartNew())` SemaphoreSlim(1,1) WaitAsync не работает как lock? S>>balace-- атомарная.
НС>Нет, операция декремента не атомарная.
Да тупанул. Просто запись атомарна
и солнце б утром не вставало, когда бы не было меня