我使用Visual Studio 2012 RC與.Net 4.5和ASP MVC 4 RC。只要我使用異步,它就會掛起。控制器操作方法使用異步,但本身不是異步控制器方法。ASP.Net MVC 4控制器在使用異步時掛起
沒有錯誤記錄或拋出異常,但瀏覽器永遠顯示「等待www.myweb.local」。
// Simplest possible async
public class Waiter
{
public async Task<int> 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();
}
}
我這樣做,是被指出in this answer的事情,它仍然無法正常工作。 即。該web.config包含
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
而魔術字await Task.Yield();
是在異步方法。
.Net框架版本是4.5.50501。我在IIS Express和IIS 6.0上觀察到了這種行爲。
我嘗試運用「2012年7月更新」到VS2012,但沒有解決問題。
This answer suggests,這可能是因爲任務已經完成,當我等待它,但是如果是這樣的話,這應該工作,它不會:
public class Waiter
{
public async Task<int> GetValue()
{
await Task.Yield();
return await Task.Factory.StartNew(() =>
{
Thread.Sleep(1500);
return 42;
});
}
}
一對夫婦的人都認爲, ConfigureAwait(false)
是需要的,但是這個代碼不工作之一:
public async Task<int> GetValue()
{
var task = new Task<int>(() => 42);
return await task.ConfigureAwait(false);
}
以下確實工作與Razor視圖引擎,但與火花。當然,應該有辦法讓另一個場景也可以工作?可以不使用同步代碼中的異步任務嗎?
public class Waiter
{
public async Task<int> GetValue()
{
return await Task.Factory.StartNew(() => 42);
}
}
public class HomeController : Controller
{
public async Task<ActionResult> IndexAsync()
{
await Task.Yield();
var waiter = new Waiter();
int result = await waiter.GetValue();
return View();
}
}
我知道,這是不會被釋放的軟件,但微軟的駐地協調員通常是相當穩定的,所以我很驚訝,它失敗,並在無益的方式失敗。
很抱歉,如果我失去了一些東西,但爲什麼必須通過訪問結果屬性,而不是將其標記爲異步和使用的await有索引塊?如果這是有意的,您可能需要使用ConfigureAwait(假),這樣的延續不回安排在同一個線程。 – 2012-07-06 15:12:27
我測試移植現有網站.NET 4.5。它使用火花視圖引擎。我想在處理異步控制器之前獲得異步工作,以及Spark是否可以處理Task或不(我的初始印象是否)。但不管我是否可以這樣做,這種情況都應該起作用。 –
Anthony
2012-07-06 15:23:17
你爲什麼從AsyncController派生?這沒有必要。見我的異步樣品http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4 – RickAndMSFT 2012-07-07 20:15:18