我创建了使用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));
}