2009-07-19 10 views
13

तर्क के लिए, यूआई थ्रेड को उस धागे के रूप में मानें जिस पर Application.Run() पर कॉल किया गया है या इसमें से एक के ओवरलोड को कॉल किया गया है और इसमें सक्रिय संदेश लूप चल रहा है।यह पता लगाने के लिए कि क्या हम यूआई थ्रेड पर हैं?

क्या यह पता लगाने का कोई तरीका है कि क्या हम वर्तमान में ऐसे धागे पर निष्पादित कर रहे हैं?

कारण मुझे यह चाहिए क्योंकि मेरे पास एक निजी समारोह वाला वर्ग है जो लंबे समय से चल रहा है। कक्षा स्वयं पहले से ही बहुप्रचारित है, और इस वर्ग का उपयोग ऐसा है कि इसका उपयोग यूआई या प्रसंस्करण करने वाले पृष्ठभूमि धागे से किया जा सकता है। यह कार्य भी इस नेट में पड़ता है। लेकिन मैं नहीं चाहता कि यह यूआई थ्रेड को अवरुद्ध करे। इसलिए मैं यह जानना चाहता हूं कि मैं यूआई थ्रेड पर चल रहा हूं और यदि ऐसा है, तो फ़ंक्शन फ़ंक्शन को पृष्ठभूमि थ्रेड में कॉल करें (शायद ThreadPool, लेकिन यह इस चर्चा के लिए एक गैर-समस्या है)। यह पूरी तरह से व्यवहार किया जाता है, लेकिन पृष्ठभूमि धागे शायद फ़ंक्शन के आउटपुट पर निर्भर हैं, इसलिए उनके लिए अवरुद्ध करना बेहतर है, जबकि यूआई थ्रेड इसे "सेट-एंड-भूल" तरीके से एक्सेस कर रहा है।

उत्तर

7

मेरा सुझाव है कि यह निर्णय फोन करने वाले बनाना चाहिए की तरह है देखते हैं। आप इसे आसान बनाने के लिए हमेशा रैपर विधियों को लिख सकते हैं - लेकिन इसका मतलब है कि आपको कॉलर के साथ "विषम" स्थिति में समस्या नहीं होगी (उदाहरण के लिए एक यूआई फ्रेमवर्क जिसे आप नहीं जानते हैं, या किसी ईवेंट लूप के साथ कुछ और) और आप उनके लिए गलत निर्णय ले रहे हैं।

यदि विधि को सही धागे में प्रतिक्रिया प्रदान करने की आवश्यकता है, तो मैं यूआई-अज्ञेय तरीके से ऐसा करने के लिए ISynchronizeInvoke (Control द्वारा कार्यान्वित) में पास करूंगा।

12

यदि आपके पास Form या Control तक पहुंच है, तो आप InvokeRequired संपत्ति देख सकते हैं; यदि आप यूआई थ्रेड और true पर हैं तो यह false पर वापस आ जाएगा यदि आप नहीं हैं .. यदि यह किसी संदर्भ में होता है जहां आप Control के खिलाफ जांच नहीं कर सकते हैं, तो आप आसानी से अपने प्रोग्राम में एक स्थिर संपत्ति सेट कर सकते हैं जिसे आप जांच सकते हैं। स्टार्टअप पर Thread.CurrentThread के लिए एक संदर्भ संग्रहीत करें, और कि संदर्भ के लिए Thread.CurrentThread तुलना जब आप जानते हैं की जरूरत है:

static class Program 
{ 
    private static Thread _startupThread = null; 

    [STAThread] 
    static void Main() 
    { 
     _startupThread = Thread.CurrentThread; 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

    public static bool IsRunningOnStartupThread() 
    { 
     return Thread.CurrentThread == _startupThread; 
    } 
} 

Program.IsRunningOnStartupThread बुला कर आप अगर आप कर रहे हैं या नहीं मिलेगा एक bool कह।

+0

स्टार्टअपथ्रेड जरूरी नहीं है कि जीयूआई थ्रेड, या केवल जीयूआई थ्रेड हो। –

+1

WRONG: InvokeRequired रिटर्न सही है अगर "नियंत्रण पर बनाया गया था उससे अलग धागा" –

+1

@ रिको: हां, ज़ाहिर है। मुझे विश्वास नहीं है कि टाइपो पिछले तीन सालों से वहां बैठा है और कोई भी ध्यान नहीं दे रहा है। इसे पकड़ने के लिए धन्यवाद, मैंने तदनुसार जवाब अपडेट किया। –

8

बूल isMessageLoopThread = System.Windows.Forms.Aplication.MessageLoop;

+0

यह मेरे उद्देश्यों के लिए सबसे सरल जवाब है। – ToolmakerSteve

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