Контроллер ASP.Net MVC 4 зависает всякий раз, когда используется асинхронность

Я использую Visual Studio 2012 RC с.Net 4.5 и ASP MVC 4 RC. Он зависает всякий раз, когда я вообще использую асинхронность. Метод действия контроллера использует асинхронный режим, но сам по себе не является асинхронным методом контроллера.

Никаких ошибок или исключений не регистрируется, но браузер постоянно показывает «Ожидание www.myweb.local ».

// Simplest possible async
public class Waiter
{
    public async Task GetValue()
    {
        await Task.Yield();
        return await Task.Factory.StartNew(() => 42);
    }
}

// simplest possible controller that uses the async
public class HomeController : Controller

    public ActionResult Index()
    {
        var waiter = new Waiter();
        var resultTask = waiter.GetValue();
        int result = resultTask.Result;

        // it never gets here 
        return View();
    }
}

Я сделал то, что указано в этом ответе , и это все еще не работает. т.е. Web.config содержит


А волшебные слова await Task.Yield();— в асинхронном методе.

Версия платформы.Net — 4.5.50501. Я наблюдал такое поведение в IIS Express и в IIS 6.0.

Я попытался применить «обновление за июль 2012 года» к VS2012, но это не помогло.

Этот ответ предполагает , что это может быть связано с тем, что задача уже завершена, когда я ее жду, однако, если это так, это должно работать, а не:

public class Waiter
{
    public async Task GetValue()
    {
        await Task.Yield();
        return await Task.Factory.StartNew(() => 
            {
                Thread.Sleep(1500);
                return 42;
            });
    }
}

Пара человек предположила, что нужен ConfigureAwait(false), но и этот код не работает:

    public async Task GetValue()
    {
        var task = new Task(() => 42);
        return await task.ConfigureAwait(false);
    }

Следующий работает с механизмом просмотра бритвы, но не со искрой. Наверняка должен быть способ заставить работать и другой сценарий? Нельзя ли использовать асинхронные задачи внутри синхронного кода?

public class Waiter
{
    public async Task GetValue()
    {
        return await Task.Factory.StartNew(() => 42);
    }
}

public class HomeController : Controller
{
    public async Task IndexAsync()
    {
        await Task.Yield();
        var waiter = new Waiter();
        int result = await waiter.GetValue();

        return View();
    }
}

Я знаю, что это не выпущенное программное обеспечение, но RC Microsoft обычно довольно стабильны, поэтому я удивлен, что они терпят неудачу, и терпят неудачу бесполезным образом.

9
задан 18 revs, 3 users 75% 23 May 2017 в 11:45
поделиться