我想了解與MVC異步/ AWAIT機制。現在我不考慮使用情況下我會出去的「正常流動」的(使用完全同步或異步滿端至端)。我只想確保瞭解爲什麼它不起作用。爲什麼我不能運行異步代碼同步
當調用「SyncMethod」時,它會無限期地掛起並永不返回。
當「AsyncMethod」被稱爲很快返回一個視圖沒有掛。
當調用「TaskMethod」時,它會很快返回一個視圖而不會掛起。
我不完全知道爲什麼當同步方法調用異步方法時,不可能返回結果。
我在這裏錯過了什麼?
using System;
using System.Threading.Tasks;
using System.Web.Mvc;
namespace MvcAsyncAwaitTest.Controllers
{
public class HomeController : Controller
{
/// <summary>
/// Synchronous method running async method as sync
/// Hangs at Hello().Result, never returns
/// </summary>
/// <returns></returns>
public ActionResult SyncMethod()
{
ViewBag.Message = Hello().Result;
return View();
}
/// <summary>
/// Asynchronous method awaiting asynchronous method
/// Do not hang
/// </summary>
/// <returns></returns>
public async Task<ActionResult> AsyncMethod()
{
ViewBag.Message = await Hello();
return View("Index");
}
/// <summary>
/// Synchronous method running a task based method synchronously
/// Returns a valid result
/// </summary>
/// <returns></returns>
public ActionResult TaskMethod()
{
ViewBag.Message = Hello2().Result;
return View("index");
}
private async Task<string> Hello()
{
return await HelloImpl();
}
private Task<string> Hello2()
{
return Task.Run(() => "Hello world 2");
}
private async Task<String> HelloImpl()
{
return await Task.Run(() => "Hello World");
}
}
}
Stephen Cleary在此解釋了異步/死鎖困境:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html – dcastro
「Hello()」有什麼意義?它什麼都不做。只需直接調用'HelloImpl'即可。另外,爲了讓你可以等待你返回的任務,沒有必要做一個'async'方法。只是讓該方法不是'async'並直接返回該任務。 – Servy
@Servy我可以做一個複雜的實現和所有的,但我者優先把一個很簡單的例子就明白了什麼是這裏的問題。但是如果你想要一個更加複雜的實現,就像使用完全一樣的asp.net標識框架。 – Erick