【发布时间】:2012-09-23 23:46:31
【问题描述】:
我使用 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));
}
【问题讨论】:
-
我想弄清楚为什么你想让一个线程在一个 aspx 页面上休眠
-
@Lawrence Johnson - 这是一个故意设计的示例,旨在说明行为。如果你愿意,你可以把它想象成“PerformExpensiveDatabaseTasks”。
标签: asp.net task-parallel-library async-await