2012-05-19 19 views

उत्तर

30

Task.Factory.Start एक नया Thread अप को सक्रिय कर देगा और इसलिए आप हाथ से इसे पारित करने की जरूरत है क्योंकि HttpContext.Context, एक धागा यह स्वत: नई Thread को कॉपी नहीं किया जाएगा करने के लिए स्थानीय है:

var task = Task.Factory.StartNew(
    state => 
     { 
      var context = (HttpContext) state; 
      //use context 
     }, 
    HttpContext.Current); 
+0

दिलचस्प रूप से पर्याप्त है, जो मेरे लिए अजीब काम करता है। उदाहरण के लिए, थ्रेड में प्रवेश करने के बाद HttpContext की उपयोगकर्ता प्रॉपर्टी शून्य हो जाती है, हालांकि इसमें HttpContext.Current में मूल्य था। – Giedrius

+2

हां, यह ध्यान देने योग्य है कि HttpContext.Current के संदर्भ का उपयोग करके बहुत समय काम हो सकता है लेकिन इसकी अनुशंसा नहीं की जाती है और यह कभी-कभी विफल होने की संभावना है। एएसपी रनटाइम ऑब्जेक्ट को साफ़ कर सकता है जब http अनुरोध किया जाता है और फिर आपको 'context.Items [x]' जैसी चीजें मिलती हैं जो आपने पहले रखी थीं। यह भी देखें http://stackoverflow.com/questions/8925227/access-httpcontext-current-from-threads – Rory

8

आप कर सकते थे एक बंद का उपयोग नव निर्मित धागे पर यह उपलब्ध है:

var currentContext = HttpContext.Current; 

Task.Factory.Start(() => { 
    // currentContext is not null here 
}); 

लेकिन यह एक काम HTTP अनुरोध के जीवनकाल से अधिक जीवित कर सकते हैं और जब HTT तक पहुँचने अजीब परिणाम के लिए ले जा सकता है को ध्यान में रखना अनुरोध पूरा होने के बाद पीसीटेक्स्ट।

+0

मुझे किसी राज्य ऑब्जेक्ट में गुजरने और आइटम को अलग-अलग चरों में कास्टिंग करने के बजाय इस तरह से उपयोग करना पसंद है ... गन्दा। –

0

David ने बताया, HttpContext.Current हर समय काम नहीं करेगा। मेरे मामले में, लगभग 20 में से 1 बार, CurrentContext शून्य हो जाएगा। नीचे के साथ खत्म करो।

string UserName = Context.User.Identity.Name; 

System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    UserName ... 
} 
संबंधित मुद्दे