如何在不使用Task
或Thread
的情況下爲asp.net應用程序中的代碼塊實現超時?我不想創建新線程,因爲HttpContext
將在另一個線程中爲NULL
。方法超時而不創建新線程
例如,下面的代碼將無法正常工作
var task = Task.Run(() =>
{
var test = MethodWithContext();
});
if (!task.Wait(TimeSpan.FromSeconds(5)))
throw new Exception("Timeout");
object MethodWithContext()
{
return HttpContext.Current.Items["Test"]; // <--- HttpContext is NULL
}
編輯:
我不想通過當前上下文的方法,因爲我有很多的方法裏面嵌套的方法...所以很多的重構必須爲此解決方案來完成
EDIT2:
我已經意識到我可以創建新任務之前,分配當前上下文變量並用此變量替換任務中的HttpContext
。這將是安全的?
var ctx = HttpContext.Current;
var task = Task.Run(() =>
{
HttpContext.Current = ctx;
var test = MethodWithContext();
});
if (!task.Wait(TimeSpan.FromSeconds(5)))
throw new Exception("Timeout");
object MethodWithContext()
{
return HttpContext.Current.Items["Test"]; // now works correctly
}
爲什麼你不想爲此創建一個任務? – user9993
爲什麼你需要工作線程中的HttpContext?只需通過所有需要的信息,他們不需要任何其他「上下文」 – Szer
@Szer是的,這個例子很簡單,但在許多嵌套方法使用HttpContext的情況下,可能難以重構代碼 – mkul