2011-08-27 14 views
9

मैं सी # के लिए नया हूं, लेकिन मैंने बहुत सारे जावा किए हैं। यहां मेरी समस्या है: मैं एक थ्रेड से "SaveFileDialog" खोलने की कोशिश कर रहा हूं जो यूआई थ्रेड नहीं है।सी #: अन्य थ्रेड से यूआई थ्रेड पर संवाद दिखाएं

यह वास्तव में क्या मैं करने की कोशिश है:

public partial class Form1: Form 
{ 
    public string AskSaveFile() 
    { 
     var sfd = new SaveFileDialog(); 
     sfd.Filter = "Fichiers txt (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"; 
     sfd.FilterIndex = 1; 
     sfd.RestoreDirectory = true; 
     DialogResult result = (DialogResult) Invoke(new Action(() => sfd.ShowDialog(this))); 
     if(result == DialogResult.OK) 
     { 
      return sfd.FileName; 
     } 

     return null; 
    } 
} 

इस विधि हमेशा एक धागा एक है जो फार्म का मालिक से अलग से बुलाया जाएगा। समस्या यह है कि जब मैं इस कोड को निष्पादित करता हूं, तो "फॉर्म 1" फ्रीज और "SaveFileDialog" दिखाई नहीं देता है।

क्या आपके पास एक स्वतंत्र धागे से संवाद दिखाने में मेरी मदद करने के लिए कुछ सुराग है?

उत्तर

6

इस प्रयास करें:

public partial class Form1: Form 
{ 
    public string AskSaveFile() 
    { 
     if (this.InvokeRequired) 
     { 
      Invoke(new MethodInvoker(delegate() { AskSaveFile(); })); 
     } 
     else 
     { 
      var sfd = new SaveFileDialog(); 
      sfd.Filter = "Fichiers txt (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"; 
      sfd.FilterIndex = 1; 
      sfd.RestoreDirectory = true; 
      if(sfd.ShowDialog() == DialogResult.OK) return sfd.FileName; 
     }    
     return null; 
    } 
} 
+0

काम नहीं कर रहा: "AskSaveFile" को एक स्ट्रिंग वापस करने की आवश्यकता है। और यदि मैं "एंडइवोक" के साथ परिणाम की प्रतीक्षा करता हूं तो मुझे एक ही समस्या ("फॉर्म 1" ठंड लगती है)। – Moinonime

+0

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

+0

एक प्रश्न: आपके धागे थ्रेड या पृष्ठभूमिवर्कर्स हैं? – Marco

11

यह इस तरह बनाएं:

public string AskSaveFile() { 
     if (this.InvokeRequired) { 
      return (string)Invoke(new Func<string>(() => AskSaveFile())); 
     } 
     else { 
      var sfd = new SaveFileDialog(); 
      sfd.Filter = "Fichiers txt (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"; 
      sfd.FilterIndex = 1; 
      sfd.RestoreDirectory = true; 
      return sfd.ShowDialog() == DialogResult.OK ? sfd.FileName : null; 
     } 
    } 

आप अभी भी मिलता है, तो गतिरोध तो डिबगर के डीबग + विंडोज + धागे खिड़की का उपयोग सुनिश्चित करें और क्या देखो यूआई थ्रेड कर रहा है। Control.Invoke() तब तक पूरा नहीं हो सकता जब तक कि यूआई थ्रेड निष्क्रिय न हो और संदेश लूप पंप कर न हो। कार्यकर्ता धागे को खत्म करने की प्रतीक्षा हमेशा डेडलॉक का कारण बनती है।

भी विचार है कि कोड के इस प्रकार जोखिम भरा है, उपयोगकर्ता इस संवाद उम्मीद नहीं कर अचानक दिखाने के लिए और गलती से इसे बंद कर देते माउस ले जाने या खिड़की (रों) यूआई धागा के स्वामित्व में keyboarding करने के लिए।

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