2010-12-01 6 views

उत्तर

5

दुर्भाग्य से 100% सटीकता के साथ इस प्रश्न का उत्तर देना मुश्किल है क्योंकि यह हमेशा पूरी तरह से स्पष्ट नहीं है कि जीयूआई संदर्भ क्या है। यह हां/नहीं उत्तर से एक ह्युरिस्टिक है। और हर जीआईआई ढांचे के लिए ह्युरिस्टिक अलग होगा।

WPF के लिए एक अच्छा एक मौजूदा धागा

public static bool IsWpfGuiThread() { 
    return Dispatcher.FromThread(Thread.CurrentThread) != null; 
} 

हालांकि इस के लिए जाँच करें और अगर वहाँ देखने के लिए एक सक्रिय Dispatcher के रूप में सिर्फ एक यादृच्छिक धागे पर एक Dispatcher की स्थापना, लेकिन वास्तव में डाल नहीं द्वारा मूर्ख बनाया जा सकता है इसके ऊपर एक जीयूआई।

WinForms के लिए जांच करने के लिए एक अच्छा एक वर्तमान SynchronizationContext है।

public static bool IsWinFormsGuiThread() { 
    return SynchronizationContext.Current is WindowsFormsSynchronizationContext; 
} 

हालांकि इस किसी के द्वारा अस्थायी रूप से (या लंबे समय तक) मूर्ख बनाया जा सकता है एक और तुल्यकालन संदर्भ के लिए Current मूल्य को रीसेट। यह अनिवार्य रूप से सिर्फ एक वैश्विक धागा है और किसी के द्वारा सेट किया जा सकता है। विजुअल स्टूडियो जैसे कुछ अनुप्रयोगों में इसे बदलने के लिए वास्तव में काफी आम है (लेकिन यह एक WPF ऐप है)

+0

मुझे पता है कि यह एक पुराना उत्तर है, लेकिन ... डब्ल्यूपीएफ ऐप में कई यूआई थ्रेड हो सकते हैं, [डिस्पैचर.फ्रेम थ्रेड()] (https: // msdn का उपयोग कर मौजूदा थ्रेड पर सक्रिय प्रेषक की जांच कर रहे हैं। microsoft.com/en-us/library/system.windows.threading.dispatcher.fromthread(v=vs.110).aspx) एक अच्छा संकेतक नहीं है कि यह एक (या "the") UI थ्रेड है। इसे संभालने के सर्वोत्तम तरीकों में से एक है थ्रेड के सिंक्रनाइज़ेशन कॉन्टेक्स्ट का ट्रैक रखना जो लंबे समय तक चलने वाला या पृष्ठभूमि थ्रेड शुरू करता है, यह वह जगह है जहां async/await सहायक हो सकता है (यह नहीं कि जब यह उत्तर पहली बार लिखा गया था तब वे अस्तित्व में थे)। – slugster

1

क्या आप पूछ रहे हैं कि आपके पास ज्ञात गुई ऑब्जेक्ट है या नहीं, यह देखने के लिए कि क्या आप उचित संदर्भ में हैं या नहीं वह वस्तु? मुझे लगता है कि guiObject.VerifyAccess() इसके लिए काम करेगा।

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