2009-08-10 10 views
5

दूसरों सुनिश्चित करने के लिए अभी जिस तरह से मुझे क्या करना:सी # संकलन समय तरीकों केवल यूआई धागे पर कहा जाता है, और केवल एक पृष्ठभूमि (गैर यूआई) में धागा

Util.AssertBackgroundThread();

या

Util.AssertUIThread(); विधियों की शुरुआत में

। यह बहुत बुरा नहीं है, लेकिन यह रनटाइम त्रुटि जांच है। सी # जैसे स्थिर भाषाओं का उपयोग करने का कारण संकलक के कंधों पर अधिक त्रुटि जांच को स्थानांतरित करना है।

अब मुझे नहीं लगता कि यह आम तौर पर आसान है, लेकिन अगर मैं अपने स्वयं के उपयोगिता विधियों से केवल थ्रेड लॉन्च करने (या थ्रेडपूल.क्यूयूयूसर वर्कइटम का उपयोग करके) प्रतिबंधित करता हूं, तो मुझे लगता है कि अगर मैं उन तरीकों को चिह्नित करता हूं, तो यह मुझे लगता है यह सत्यापित करने के लिए स्थैतिक विश्लेषण करना संभव होना चाहिए कि यूआई थ्रेड पर चलाने के लिए केवल उन्हीं विधियों को केवल यूआई थ्रेड पर ही चलाया जा सकता है?

तो यहां एक में दो प्रश्न हैं।

  1. क्या मैं सही हूं कि इसे संकलित समय पर चेक किया जा सकता है?
  2. वहाँ दृश्य स्टूडियो 2008 (नवीनतम ReSharper के साथ स्थापित)

उत्तर

5

मैं हमेशा पैटर्न इसे पसंद किया:

public void GuiMethod(object param) 
{ 
    if(this.InvokeRequired) 
    { 
     this.Invoke(delgateToGuiMethod, params,...) 
    } 
    else 
    { 
     //perform gui thread method 
    } 
} 

आप आह्वान करने के लिए और जांच करने के लिए दंड भुगतना, लेकिन आप विधि की गारंटी या तो जीयूआई धागा पर चल रहा है सकते हैं, या का उपयोग कर जीयूआई धागा पर सक्रिय किया जाएगा यह पैटर्न

2

केवल एक चीज मैं मदद करने के बारे में सोच सकते हैं कि आप बनाने के लिए है में यह करने के लिए किसी भी व्यावहारिक तरीका है अपने दावा है उनके शरीर में #if DEBUG उपयोग करती हैं इसलिए कि रिलीज पर विधियां खाली हैं।

उदा।

public static void AssertUIThread() 
{ 
#if DEBUG 
    //the code goes here 
#endif 
} 

इस तरह आप विकास के दौरान जाँच कर सकते हैं अगर आप तरीकों उचित रूप से कॉल कर रहे हैं, और JIT अपने उत्पादन कोड में पूरी तरह से कॉल निकाल देंगे।

मुझे इस समय संकलन-समय पर ऐसा करने का कोई तरीका नहीं दिख रहा है, लेकिन मैं इस प्रश्न का उत्तर इस उम्मीद में कर रहा हूं कि इसका उत्तर दिया जाएगा।

संपादित करें:

अधिक मैं इसके बारे में सोचो, और अधिक मुझे लगता है कि तुम क्या आप एक कस्टम FxCop शासन के बाद संकलन का उपयोग कर करना चाहते हैं ऐसा करने में सक्षम हो सकता है। बात यह है कि ... मुझे इंट्रोस्पेक्शन एपीआई नहीं पता है जो FxCop प्रदान करता है, और यह अच्छी तरह से प्रलेखित नहीं है। या बल्कि, यह बिल्कुल दस्तावेज नहीं है। सबसे अच्छा मैं आपके लिए कर सकता हूं a tutorial या two प्रदान करता है जो आपकी मदद कर सकता है या नहीं भी। मैं वर्तमान में उन्हें पढ़ने के बीच में हूं; अगर मुझे कुछ दिलचस्प लगता है, तो मैं इसे पोस्ट करूंगा।

संपादित करें 2:

AHAH! आप the caller and the callees of a method का विश्लेषण कर सकते हैं। वहां निर्दिष्ट ट्यूटोरियल का उपयोग करके विशेष रूप से उन तरीकों के लिए एक विशेषता बनाएं जिन्हें हमेशा यूआई थ्रेड से बुलाया जाना चाहिए, और अन्य तरीकों के लिए जिन्हें केवल एक अलग धागे से बुलाया जाना चाहिए। आपका कस्टम नियम इन विशेषताओं में से किसी एक के लिए जांचता है और केवल एक विधि में विशेषता होने पर ही चलता है। इसके बाद यह उस विधि के कॉलर्स का विश्लेषण करता है (और उनके कॉलर्स, और बहुत आगे, पुनरावर्ती) जब तक यह निर्धारित नहीं कर सकता कि कॉलर या तो यूआई थ्रेड पर या नए थ्रेड से था।

अब हम मुश्किल भाग में आ गए हैं।मैं अभी तक इस भाग को समझने में सक्षम नहीं हूं, और मैं यह देखने के लिए आपको छोड़ देता हूं कि आप किसके साथ आ सकते हैं, क्योंकि देर हो चुकी है और मैं समस्या के लिए ज्यादा समय नहीं दे सकता लेकिन मुझे बहुत दिलचस्पी है समाधान। जिस समस्या में मैं चल रहा हूं वह यह है कि धागे सभी प्रतिनिधियों का उपयोग शुरू कर रहे हैं, और मुझे लगता है कि उन प्रतिनिधियों को कॉलर श्रृंखला को आगे बढ़ाने में परेशानी होगी। मुझे नहीं पता कि से प्रतिनिधि प्राप्त करना संभव होगा; यदि यह संभव था, तो प्रतिनिधि प्रकार को ज्ञात थ्रेडिंग प्रतिनिधियों से तुलना की जा सकती है ताकि यह निर्धारित किया जा सके कि कॉल नए धागे पर किया गया था या नहीं।

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

तो, हल करने में समस्याएं। लेकिन, उम्मीद है कि, आपके लिए पहला कदम है।

+0

मैंने ऐसा किया है, असल में मेरे पास सभी Assert * विधियां हैं जो एक असर विधि को कॉल करती हैं जो वास्तव में काम करती है, और उसके शरीर के आस-पास #if DEBUG है। मुझे यकीन है कि जेआईटी खाली कॉल की श्रृंखला को हटाने के लिए काफी स्मार्ट है। – Eloff

+3

@Eloff: 'Assert' विधि' चिह्नित करें [सशर्त ("DEBUG")] '। यही वह है जो इसके लिए है;) –

+0

@ 280z28: चीजों को करने का एक बेहतर तरीका। मैं उस बारे में भूल गया था। – Randolpho

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