2013-09-05 5 views
5

हाल ही में मैं एक मालिकाना तीसरे पक्ष के पुस्तकालय में आए ब्लॉक नहीं है और वहाँ इस तरह से एक विधि व्यवहार है:कॉल को अवरुद्ध करने लेकिन धागा

public Point ClickOnDrawMat(DrawMat drwmat) 
{ 
    Point pt; 
    //waiting user mouse click on DrawMat and assign to pt 
    return pt; 
} 

जब मेरे कोड मुख्य थ्रेड से इस विधि बुला, यह अवरुद्ध कर देगा उपयोगकर्ता द्वारा क्लिक किए जाने तक इस विधि पर, ClickOnDrawMat से पॉइंट रिटर्न प्राप्त करें।

public void button1_Click(object sender, EventArgs e) 
{ 
    Point userClickedPoint = ClickOnDrawMat(oDrwMat); //Wait until user clicked 
    //Do stuff with point we got 
} 

हालांकि, यह मुख्य धागे को अवरुद्ध नहीं करता है। मैं अभी भी अन्य बटन/यूआई नियंत्रण दबा सकता हूं, जबकि यह अभी भी उपयोगकर्ता क्लिक के लिए इंतजार कर रहा है।
मैंने देखा कि उपयोगकर्ता क्लिक की प्रतीक्षा करने पर, CPU कोर उपयोग में से एक बहुत अधिक (~ 75%) लगता है।

और यह कॉल स्टैक का एक उदाहरण के बाद मैं, जबकि यह अभी भी उपयोगकर्ता क्लिक के लिए इंतज़ार कर एक और बटन पर क्लिक करें है:

myProgram.frmMain.button2_Click(xxx) Line 23 
[External Code] 
ThirdPartyLib.ClickOnDrawMat(xxx) Line 16 
myProgram.frmMain.button1_Click(xxx) Line 14 

मैं सोच रहा हूँ कि यह कैसे किया जा सकता है?
अग्रिम धन्यवाद!

+2

लाइब्रेरी क्या है? – Servy

+0

कंप्यूटर दृष्टि के लिए मालिकाना पुस्तकालय हैल्कन। – user1755712

उत्तर

7

हम आपको यह नहीं बता सकते कि यह कैसे किया जाता है जब तक कि किसी के पास लाइब्रेरी की प्रतिलिपि न हो और वे यह देखने के लिए एक अपघटनकर्ता का उपयोग करें कि कोड क्या कर रहा है (यदि आप इसे स्वयं करना चाहते हैं dotPeek निःशुल्क और उपयोग करने में आसान है)।

हालांकि, आप इसके व्यवहार का वर्णन कैसे करते हैं, यह संभवतः फ़ंक्शन के अंदर Application.DoEvents() पर कॉल करने की संभावना है, इससे अन्य संदेशों को संसाधित किया जाएगा जबकि लंबी चल रही प्रक्रिया यह कर रही है।

यह अपने उच्च CPU लागत की वजह से मतदान के संचालन के लिए लगभग कभी नहीं अच्छा एक कोडन अभ्यास है, जैसा कि आप देखा है, मैं यह अपने खुद के कोड में नहीं करने की सलाह देते।

"सही" जिस तरह से इस संभाल करने Asynchronous Programming Patterns से एक का उपयोग है: async/await feature .NET 4.5 में जोड़ा गया है या के रूप में एक NuGet package for 4.0 (TAP), पुस्तकालय का अपना एक घटना (EAP) जुटाने या उनमें लगी है फ़ंक्शन समाप्त होने पर कॉलबैक फ़ंक्शन का उपयोग करें (APM)। फ़ंक्शन के अंदर ही इसे एक ईवेंट संचालित सिस्टम का आंतरिक रूप से उपयोग करना चाहिए ताकि यह सीपीयू पावर का उपयोग न करे, जबकि यह मतदान के बजाए किसी ईवेंट की प्रतीक्षा कर रहा है।

+0

ओपी सीपीयू गतिविधि के बारे में क्या कहता है, यह जवाब अच्छा लगता है। –

+0

धन्यवाद! यह अजीब जादू की व्याख्या! DotPeek और Async/Await के सुझाव के लिए भी धन्यवाद! क्या मैं पूछ सकता हूं, क्या .NET 3.5 में एसिंक/प्रतीक्षा सुविधा का उपयोग करने का कोई तरीका है? – user1755712

+1

नहीं, लेकिन मैंने कुछ और लिंक जोड़े जो एसिंक/प्रतीक्षा के अलावा कुछ अन्य विकल्प दिखाते हैं। –

संबंधित मुद्दे