नई async के साथ/सी # में कीवर्ड का इंतजार है, अब जिस तरह से (और जब) आप ThreadStatic डेटा का उपयोग करने के प्रभावों देखते हैं, क्योंकि कॉलबैक प्रतिनिधि एक async
के लिए एक अलग थ्रेड पर निष्पादित किया जाता है ऑपरेशन शुरू हुआ। उदाहरण के लिए, निम्नलिखित सरल कंसोल अनुप्रयोग: की रेखा के साथasync साथ ThreadStatic वैरिएबल का उपयोग/इंतजार
[ThreadStatic]
private static string Secret;
static void Main(string[] args)
{
Start().Wait();
Console.ReadKey();
}
private static async Task Start()
{
Secret = "moo moo";
Console.WriteLine("Started on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Secret is [{0}]", Secret);
await Sleepy();
Console.WriteLine("Finished on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Secret is [{0}]", Secret);
}
private static async Task Sleepy()
{
Console.WriteLine("Was on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
await Task.Delay(1000);
Console.WriteLine("Now on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
}
इच्छा उत्पादन कुछ:
Started on thread [9]
Secret is [moo moo]
Was on thread [9]
Now on thread [11]
Finished on thread [11]
Secret is []
मैं भी CallContext.SetData
और CallContext.GetData
का उपयोग कर के साथ प्रयोग किया और एक ही व्यवहार मिल गया है।
कुछ संबंधित प्रश्न और धागे को पढ़ने के बाद:
- CallContext vs ThreadStatic
- http://forum.springframework.net/showthread.php?572-CallContext-vs-ThreadStatic-vs-HttpContext&highlight=LogicalThreadContext
- http://piers7.blogspot.co.uk/2005/11/threadstatic-callcontext-and_02.html
ऐसा लगता है कि ASP.Net तरह चौखटे स्पष्ट रूप से माइग्रेट करती धागे भर में HttpContext, लेकिन नहीं CallContext
, तो शायदके उपयोग के साथ भी यही बात हो रही हैऔर await
कीवर्ड?
एसिंक/प्रतीक्षा कीवर्ड के उपयोग के साथ, निष्पादन के किसी विशेष थ्रेड से जुड़े डेटा को संग्रहीत करने का सबसे अच्छा तरीका क्या है (स्वचालित रूप से!) कॉलबैक थ्रेड पर पुनर्स्थापित किया जा सकता है?
धन्यवाद,
डब्ल्यूसीएफ के मामलों में क्या है? क्या मुझे इसके बजाय 'ऑपरेशन कॉन्टेक्स्ट' का उपयोग करना चाहिए, बशर्ते कि यह नए धागे पर माइग्रेट हो जाए? – theburningmonk
@theburningmonk अगर आपका मतलब * आवृत्ति * है, तो उसे काम करना चाहिए। लेकिन मुझे संदेह है कि स्थैतिक 'ऑपरेशन कॉन्टेक्स्ट.क्यूरेंट' सही तरीके से काम करेगा। तो 'var ctx = OperationContext.Current;' शीर्ष पर (मूल धागे पर), और फिर 'ctx' को संदर्भित करें, न कि' ऑपरेशन कॉन्टेक्स्ट.क्यूरेंट' –
'ताकि आप यह कह रहे हों कि जब तक आप वर्तमान' ऑपरेशन कॉन्टेक्स्ट को कैप्चर नहीं करते 'प्रतीक्षा' से पहले बंद होने पर आप 'प्रतीक्षा 'के बाद' ऑपरेशन कॉन्टेक्स्ट 'के समान उदाहरण वापस नहीं पाएंगे? – theburningmonk