2010-01-28 21 views
7

मैं इस तरह बाहरी ऐप के लिए खींचें ड्रॉप कर रहा हूँ WinForms अनुप्रयोग जमा:DoDragDrop कभी कभी

string[] files = new string[/* */]; 

// get files 

DataObject o = new DataObject(DataFormats.FileDrop, files); 
DoDragDrop(o, DragDropEffects.Copy | DragDropEffects.Move); 

और कुछ क्षुधा फ़ाइलें लेते हैं और उन्हें और मेरे ऐप पर कार्रवाई करने के पर चले जाएँगे यह सामान है करने के लिए स्वतंत्र है , लेकिन कुछ ऐप्स मेरी ऐप को फ्रीज कर देंगे जब तक कि यह सभी फाइलों को संसाधित नहीं करता ... क्या मैं इसके आसपास जा सकता हूं? मैंने इसे थ्रेड में करने की कोशिश की है लेकिन यह इतना अच्छा काम नहीं करता है - यह बिल्कुल काम नहीं करता ... इसलिए, इस कोड को बनाने के लिए कोई सुझाव मेरे ऐप को लटका नहीं देता है?

उत्तर

3

नेट Control.DoDragDrop Win32 एपीआई कहा जाता है .. (यह के लिए प्रतीक्षा) के चारों ओर सिर्फ एक wapper है .. DoDragDrop

तो यह एक ही सीमाएँ हैं। DoDragDrop को केवल थ्रेड से बुलाया जा सकता है जिसे OleInitialize कहा जाता है, जो थ्रेड को एसटीए (सिंगल थ्रेडेड अपार्टमेंट) टाइप थ्रेड बनाता है।

क्योंकि इसका उपयोग केवल एसटीए थ्रेड द्वारा किया जा सकता है, और एपीआई डिज़ाइन तुल्यकालिक है, आप गंतव्य अनुप्रयोगों की ड्रॉप नोटिफिकेशन को संभालने की दया पर हैं। यह ओएलई ड्रैग और ड्रॉप के डिजाइन का हिस्सा है और इसे बदला नहीं जा सकता है। (विंडोज़ अनुप्रयोगों में धागे भी मौजूद होने से पहले ओएलई ड्रैग और ड्रॉप वास्तव में विंडोज 3x दिनों में डिज़ाइन किया गया था)।

तो, आप शायद यह काम किसी अन्य थ्रेड IFF पर बना सकते हैं कि थ्रेड एक एसटीए थ्रेड है। अप्रबंधित DoDragDrop फ़ंक्शन को कॉल करने के लिए आपको शायद इंटरऑप का उपयोग करना होगा।

+0

हम्म, यह दिलचस्प है और मैं शर्त लगाता हूं कि आप सही हैं, लेकिन इससे समस्या हल नहीं होती है;) मेरा मतलब है ... मुझे DoDragDrop async चलाने की आवश्यकता नहीं है ... मुझे बस इतना करना है कि मुझे करना है डेटा को एसिंक होने का आदान-प्रदान करने का हिस्सा ... मैंने कहीं पढ़ा है कि डेटाऑब्जेक्ट को कुछ एसिंक इंटरफ़ेस को कार्यान्वित करना होगा, लेकिन मुझे अब यह नहीं मिल रहा है ... क्या आपको शायद पता चलेगा कि मुझे 'जगह' कहां मिल सकती है जहां मेरा ऐप दूसरे ऐप के साथ डेटा का आदान-प्रदान करता है? (DoDragDrop OFC का उपयोग करके) – argh

+0

डेटा एक्सचेंज भाग DoDragDrop के अंदर है, इसलिए यदि आप चाहते हैं कि डेटा एसिंक को एसिंक हो, तो आपको DoDragDrop को किसी अन्य थ्रेड पर रखना होगा। और यह एक एसटीए धागा होना चाहिए। क्या आप जानते हैं कि थ्रेड को .NET में एसटीए कैसे मजबूर करना है? –

+0

खैर ... मुझे ठीक कर लें मैं गलत हूँ लेकिन अगर मैं मिल गया है: [STAThread] static void मुख्य (स्ट्रिंग [] पैरामीटर) तो यह है, है ना एसटीए थ्रेड में चलाया जा रहा है? – argh

0

यह हमेशा स्थिर हो जाएगा, लेकिन देरी छोटी फ़ाइलों के साथ ध्यान देने योग्य नहीं है। this answer देखें।

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