異步方法時,我創建了使用Visual Studio 2012混淆行爲調用內部ASP.NET
一個ASP的WebApplication如果我修改默認的頁面如下:
public partial class _Default : Page
{
static async Task PerformSleepingTask()
{
Action action =() =>
{
Thread.Sleep(TimeSpan.FromSeconds(0.5));
int dummy = 3; // Just a nice place to put a break point
};
await Task.Run(action);
}
protected void Page_Load(object sender, EventArgs e)
{
Task performSleepingTask = PerformSleepingTask();
performSleepingTask.Wait();
}
}
在調用performSleepingTask.Wait()
它掛起無限期。
有趣的是,如果我設置在web.config:
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="false" />
</appSettings>
然後它的工作。 Wait
函數等待睡眠在其他線程上完成,然後繼續。
有人可以解釋:
- 爲什麼它掛?
- 他們爲什麼有什麼叫
TaskFriendlySynchronizationContext
? (由於它會導致任務掛起,我不會把它稱爲「友好」)
- 是否有一個「最佳實踐」爲調用從頁面處理方法
async
的方法呢?
這是我想出了其工作的實施,但感覺像笨拙代碼:
protected void Page_Load(object sender, EventArgs e)
{
ManualResetEvent mre = new ManualResetEvent(false);
Action act =() =>
{
Task performSleepingTask = PerformSleepingTask();
performSleepingTask.Wait();
mre.Set();
};
act.BeginInvoke(null, null);
mre.WaitOne(TimeSpan.FromSeconds(1.0));
}
我試圖弄清楚爲什麼你想讓一個線程睡在一個aspx頁面 –
@勞倫斯約翰遜 - 這是一個故意設計的例子,爲了說明行爲。如果需要,您可以將其想象爲「PerformExpensiveDatabaseTasks」。 –