2017-06-01 32 views
0

如何在不使用TaskThread的情況下爲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 
    } 
+0

爲什麼你不想爲此創建一個任務? – user9993

+0

爲什麼你需要工作線程中的HttpContext?只需通過所有需要的信息,他們不需要任何其他「上下文」 – Szer

+0

@Szer是的,這個例子很簡單,但在許多嵌套方法使用HttpContext的情況下,可能難以重構代碼 – mkul

回答

1

你需要通過你的主線程這樣的背景下:

var task = Task.Run(() => 
{ 
    // Takes the context of you current thread an passes it to the other thread. 
    var test = MethodWithContext(HttpContext.Current); 
}); 

if (!task.Wait(TimeSpan.FromSeconds(5))) 
    throw new Exception("Timeout"); 

void object MethodWithContext(HttpContext ctx) 
{ 
    // Now we are operating on the context of you main thread. 
    return ctx.Items["Test"]; 
} 

但問題仍然是:
你爲什麼要創建這樣的任務?
開始任務後,您只需等待其完成。你可以同步調用你的方法。雖然我不確定如何將執行限制在5秒鐘內。


正如您在評論中提到的,您希望擺脫附加參數,因爲您有多種方法。這是我該怎麼做:

public void YourOriginalMethod() 
{ 
    YourUtilityClass util = new YourUtilityClass(HttpContext.Current); 

    var task = Task.Run(() => 
    { 
     var test = util.MethodWithContext(); 
    }); 

    if (!task.Wait(TimeSpan.FromSeconds(5))) 
     throw new Exception("Timeout"); 
} 



public class YourUtilityClass 
{ 
    private readonly HttpContext _ctx; 

    public YourUtilityClass(HttpContext ctx) 
    { 
     if(ctx == null) 
      throw new ArgumentNullException(nameof(ctx)); 

     _ctx = ctx; 
    } 



    public void object MethodWithContext() 
    { 
     return _ctx.Items["Test"]; 
    } 


    // You can add more methods here... 
} 
+0

我可以避免傳遞上下文到方法嗎?我的意思是當我在block中有很多方法並且在這些方法中嵌套另一個方法 – mkul

+0

@mkul根據您的評論更新了我的答案。 –

+0

或者,也許只是在執行'Task.Run()'之前將變量上下文分配給變量,並且'Task.Run'內部替換了當前的上下文?它會安全嗎? 'var ctx = HttpContext.Current; var task = Task.Run(()=> { HttpContext.Current = ctx; var test = MethodWithContext()}' – mkul

相關問題