Почему добавление .Wait () к моей Задаче иногда позволяет Задаче использовать основной поток? - PullRequest
0 голосов
/ 10 сентября 2018

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

В проекте mvc asp.net framework4.6:

...
public class Test {
    public static void Work(int id) {

        if (id == Thread.CurrentThread.ManagedThreadId) {
            Debug.WriteLine("******************************");
            Debug.WriteLine("***     BOOOMMMM !!!!!!!   ***");
            Debug.WriteLine("******************************");
        }
    }
}

public class HomeController : Controller {
    public ActionResult Index() {
        var id = Thread.CurrentThread.ManagedThreadId;
        Task.Run(() => { Test.Work(id); });

        return View();
    }
...

при выполнении кода выше:

if (id == Thread.CurrentThread.ManagedThreadId)

никогда не проверяется.DoWork () работает в другом потоке, чем мой основной.Там для меня это нормально, это то, что я всегда понимал в ходе моих чтений.

Но если я ставлю Wait на Task.Run

Task.Run(() => { Test.Work(id); }).Wait();

иногда это другой поток, чемосновной, а иногда нет, и я не понимаю.

Здесь написано:

Task.Run запускает задачу в пуле потоковсделать расчеты.Пул потоков ASP.NET имеет дело с (неожиданно) потерей одного из потоков в течение этого запроса.

Хорошо, в его примере нет Wait (), но какая разница это делаетmake, Wait () вызывается после Work () в любом случае, поэтому Work () всегда должен вести себя одинаково независимо от того, есть ли Wait () или нет.

Если кто-нибудь может дать мне объяснение, я был бы оченьпризнателен.

1 Ответ

0 голосов
/ 10 сентября 2018

TPL может встраивать задачи в текущий поток, когда вы ожидаете. Это может произойти, если задача не запущена в другом потоке. Это оптимизация производительности.

Это очень спорная функция, которая вносит незначительные ошибки в приложения. По сути, любое ожидание задачи может выполнить произвольный код недетерминированным образом.

...