सामान्य/सिंक्रोनस/सिंगल-थ्रेडेड कंसोल ऐप में, एनडीसी.पश 'वर्तमान आइटम' (संभावित रूप से घोंसले के कई स्तरों पर प्रबंधन के लिए ठीक है, लेकिन इस उदाहरण के लिए केवल 1 स्तर) के प्रबंधन के लिए ठीक काम करता है।एएनसीसी-जैसे लॉग 4नेट स्टैक को एसिंक/प्रतीक्षा विधियों के साथ कैसे प्रबंधित करें? (प्रति-कार्य स्टैक?)
उदाहरण के लिए:
private static ILog s_logger = LogManager.GetLogger("Program");
static void Main(string[] args)
{
BasicConfigurator.Configure();
DoSomeWork("chunk 1");
DoSomeWork("chunk 2");
DoSomeWork("chunk 3");
}
static void DoSomeWork(string chunkName)
{
using (NDC.Push(chunkName))
{
s_logger.Info("Starting to do work");
Thread.Sleep(5000);
s_logger.Info("Finishing work");
}
}
यह उम्मीद लॉग ऑन उत्पादन में परिणाम होगा, सिर्फ 'प्रोग्राम' (बुनियादी विन्यासक के लिए डिफ़ॉल्ट पैटर्न) के अधिकार के लिए एक 'हिस्सा एक्स' एनडीसी प्रविष्टि दिखा
232 [9] जानकारी कार्यक्रम हिस्सा 1 - काम करने के लिए शुरू
5279 [9] जानकारी कार्यक्रम हिस्सा 1 - फिनिशिंग काम
5279 [9] जानकारी कार्यक्रम हिस्सा 2 - काम करने के लिए शुरू
10292 [9] जानकारी कार्यक्रम हिस्सा 2 - फिनिशिंग काम
10292 [9] जानकारी कार्यक्रम हिस्सा 3 - काम
करने के लिए शुरू 1529 9 [9] सूचना कार्यक्रम खंड 3 - काम खत्म करना
हालांकि, मैं यह नहीं समझ सकता कि 'सामान्य' async विधियों का उपयोग करके इसे कैसे बनाए रखा जाए।
उदाहरण के लिए, यह करने के लिए कोशिश कर रहा है:
private static ILog s_logger = LogManager.GetLogger("Program");
static void Main(string[] args)
{
BasicConfigurator.Configure();
var task1 = DoSomeWork("chunk 1");
var task2 = DoSomeWork("chunk 2");
var task3 = DoSomeWork("chunk 3");
Task.WaitAll(task1, task2, task3);
}
static async Task DoSomeWork(string chunkName)
{
using (log4net.LogicalThreadContext.Stacks["NDC"].Push(chunkName))
//using (log4net.ThreadContext.Stacks["NDC"].Push(chunkName))
{
s_logger.Info("Starting to do work");
await Task.Delay(5000);
s_logger.Info("Finishing work");
}
}
उन्हें शो भी प्रारंभ "सामान्य रूप से", लेकिन जब काम के लिए एक अलग धागे पर पूरा करता है, ढेर खो दिया है (मैं log4net.LogicalThreadContext होगा उम्मीद कर रही थी मुझे लगता है कि टीपीएल-'वेयर 'हो)।
234 [10] जानकारी कार्यक्रम हिस्सा 1 - काम करने के लिए शुरू
265 [10] जानकारी कार्यक्रम हिस्सा 2 - काम करने के लिए शुरू
265 [10] जानकारी कार्यक्रम हिस्सा 3 - शुरू काम करने के लिए
5280 [7] जानकारी कार्यक्रम (नल) - फिनिशिंग काम
5280 [12] जानकारी कार्यक्रम (नल) - फिनिशिंग काम
5280 [12] जानकारी कार्यक्रम (नल) - फिनिशिंग काम एक नया TaskContext (या) की तरह जोड़ने की
बाहर log4net के लिए, वहाँ गतिविधि के इस प्रकार पर नज़र रखने का एक तरीका है?
लक्ष्य वास्तव में एसिंक/प्रतीक्षा वाक्यविन्यास चीनी के साथ ऐसा करने के लिए है - या तो किसी प्रकार के थ्रेड एफ़िनिटी को मजबूर करना या कार्य करके कुंजी के आसपास एक समवर्ती शब्दकोश रखने जैसी चीजें करना संभवतः काम करने योग्य विकल्प हैं, लेकिन मैं रखने की कोशिश कर रहा हूं जितना संभव हो सके कोड के सिंक्रोनस संस्करण के करीब। :)
एफवाईआई, मैंने हाल ही में पाया है कि माइक्रोसॉफ्ट ने 'async' के साथ काम करने के लिए .NET 4.5 RTW में 'कॉलकॉन्टेक्स्ट' तय किया है। इसलिए 'लॉजिकल * डेटा' का उपयोग करके लॉग 4नेट का एनडीसी और अन्य समाधान 'async' विधियों (केवल .NET 4.5 पर) के साथ अपेक्षित काम करेगा। –
@StephenCleary कमाल! धन्यवाद! –
मुझे यकीन नहीं है कि यह तार्किक धागे संदर्भ से आने वाली समस्या है। लॉग 4नेट कार्यान्वयन मुझे गलत लगता है क्योंकि माता-पिता और बाल धागे एक ही ढेर को साझा करते हैं। बच्चे को माता-पिता के ढेर का एक क्लोन प्राप्त करना चाहिए ताकि यदि माता-पिता ढेर को संशोधित करता है तो यह बच्चे को परेशान नहीं करता है ... –