我使用 Visual Studio 2012 创建了一个 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));
}