Асинхронное и параллельное выполнение MVC4

Итак, я пытаюсь разобраться в этом новом «асинхронном» материале в .net 4.5 . Ранее я немного поигрался с асинхронными контроллерами и параллельной библиотекой задач и закончил работу с этим фрагментом кода:

Возьмем эту модель:

public class TestOutput
{
    public string One { get; set; }
    public string Two { get; set; }
    public string Three { get; set; }

    public static string DoWork(string input)
    {
        Thread.Sleep(2000);
        return input;
    }
}

Которая используется в контроллере следующим образом:

public void IndexAsync()
{
    AsyncManager.OutstandingOperations.Increment(3);

    Task.Factory.StartNew(() => 
        { 
            return TestOutput.DoWork("1"); 
        })
        .ContinueWith(t => 
        { 
            AsyncManager.OutstandingOperations.Decrement(); 
            AsyncManager.Parameters["one"] = t.Result; 
        });
    Task.Factory.StartNew(() =>
        {
            return TestOutput.DoWork("2");
        })
        .ContinueWith(t =>
        {
            AsyncManager.OutstandingOperations.Decrement();
            AsyncManager.Parameters["two"] = t.Result;
        });
    Task.Factory.StartNew(() =>
        {
            return TestOutput.DoWork("3");
        })
        .ContinueWith(t =>
        {
            AsyncManager.OutstandingOperations.Decrement();
            AsyncManager.Parameters["three"] = t.Result;
        });
}

public ActionResult IndexCompleted(string one, string two, string three)
{
    return View(new TestOutput { One = one, Two = two, Three = three });
}

Этот контроллер отображает представление в 2 секунды , благодаря магии TPL.

Теперь я ожидал (довольно наивно), что приведенный выше код преобразуется в следующее, используя новые функции «async» и «await» C # 5:

public async Task<ActionResult> Index()
{
    return View(new TestOutput
    {
        One = await Task.Run(() =>TestOutput.DoWork("one")),
        Two = await Task.Run(() =>TestOutput.DoWork("two")),
        Three = await Task.Run(() =>TestOutput.DoWork("three"))
    });
}

Этот контроллер отображает представление за 6 секунд . Где-то в переводе код перестал быть параллельным. Я знаю, что асинхронный и параллельный - это две разные концепции, но почему-то мне казалось, что код будет работать одинаково. Может ли кто-нибудь указать, что здесь происходит и как это можно исправить?

13
задан Lodewijk 30 January 2012 в 21:18
поделиться