VisualStudio2012を使用してASPWebアプリケーションを作成しました。
デフォルトのページを次のように変更した場合:
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));
}