2012-03-19 13 views
17

मैं यह त्रुटि डाउनलोडस्ट्रिंग पूर्ण ईवेंट में से कैसे प्राप्त कर सकता हूं? इसका मतलब यह नहीं है, यह खत्म हो गया है? क्या कोई और घटना है जिससे मैं इसे आग लगा सकता हूं?वेब क्लाइंट समवर्ती I/O संचालन का समर्थन नहीं करता

मुझे यह त्रुटि बहुत ही कम मिलती है, लेकिन थोड़ी देर में यह मेरे WP7 फोन पर होगी। मेरे पास एक वेब क्लाइंट है जो मैं बार-बार आग लगाता हूं, और मैं इसे पूरी घटना से फिर से आग लगा देता हूं। क्या यह हो रहा है क्योंकि अभी भी कुछ पुराने कनेक्शन खुले हैं? क्या इस 100% को रोकने का कोई तरीका है?

मैंने यह देखने के लिए जांच की है कि थ्रेड के लिए खुद को चलने का मौका है, लेकिन इसे केवल पूरी घटना के भीतर ही निकाल दिया गया है।

मैं कैसे सुनिश्चित कर सकता हूं, जब पूरा ईवेंट निकाल दिया जाता है, तो क्लाइंट अब नहीं है? एक सुझाव था कि क्लाइंट व्यस्त होने पर थ्रेड नींद के साथ थोड़ी देर जोड़ना था।

कुछ छद्म कोड।

var client = new WebClient("URL 1"); 
client.CompletedEvent += CompletedEvent; 
client.downloadasync(); 

void CompletedEvent(){ 
Dosomestuff; 
client.downloadasync(); //This is where we break. 
} 

उत्तर

8

केवल जवाब पूरे घटना के दायरे के भीतर एक नया webclient बनाने के लिए है:

निम्नलिखित धागा देखें। वेबक्लेंट को केवल पढ़ने के बाद से आप इसे नए पर सेट नहीं कर सकते हैं। एक नया ग्राहक बनाना एकमात्र समाधान है। यह पुराने क्लाइंट को पृष्ठभूमि में पूरा करने की अनुमति देता है। इसमें थोड़ी मेमोरी प्रभाव पड़ता है क्योंकि आप पुराने का पुन: उपयोग करने के बजाय एक नया उदाहरण बना रहे हैं। लेकिन कचरा कलेक्टर को साफ रखना चाहिए यदि आपका दायरा सही है।

15

वेब क्लाइंट केवल एक ही ऑपरेशन का समर्थन करता है, यह एकाधिक फ़ाइलों को डाउनलोड नहीं कर सकता है। आपने अपना कोड नहीं दिखाया है, लेकिन मेरा अनुमान है कि पुराने तरीके से पूरा होने से पहले आप किसी नए अनुरोध को फायर कर रहे हैं। मेरी शर्त यह है कि WebClient.IsBusy सत्य है जब आप एक और fetch करने का प्रयास करते हैं।

wb.DownloadFileAsync throw "WebClient does not support concurrent I/O operations." exception

+0

मेरा मुद्दा यह है कि जब तक मैं पूरी घटना में नहीं हूं तब तक मैं कभी भी downloadasync नहीं कहता। अगर मैं उस घटना में हूं तो कनेक्शन बंद नहीं होना चाहिए और ग्राहक मुक्त नहीं होना चाहिए? यदि यह मामला नहीं है, तो मैं IsBusy का उपयोग करने के अलावा इसे कैसे टाल सकता हूं? – firebellys

+0

हां, यह धागा मुझे यह करने के लिए कह रहा है कि मैं अभी क्या कर रहा हूं और मुझे त्रुटि मिल रही है। मैं उपरोक्त कुछ और जानकारी जोड़ूंगा। – firebellys

+1

बस किसी को भी परेशान करने के लिए, ऊपर दिए गए उत्तर को यहां से लिंक यहां दिए गए हैं: http://stackoverflow.com/questions/2042258/webclient-downloadfileasync-download-files-one-at-a-time – TEK

0

समाधान, मैंने पाया कि कई वेब क्लाइंट ऑब्जेक्ट्स का उपयोग करना है, ताकि आपके छद्म कोड को संशोधित किया जा सके; कोशिश करें

var client = new WebClient("URL 1"); 
client.CompletedEvent += CompletedEvent; 
client.downloadasync(); 

void CompletedEvent(){ 
Dosomestuff; 
var client2 = new WebClient(); 
client2.downloadasync(); 
} 
1

वेब क्लाइंट का उपयोग करने के बजाय एचटीपी क्लाइंट समानांतर HTTP कॉल करने के लिए उपयोग करें। कोड के नीचे फाइलें डाउनलोड करने का तरीका दिखाता है।

 HttpClient httpClient = new HttpClient(); 
     var documentList=_documentManager.GetAllDocuments(); 
     documentList.AsParallel().ForAll(doc => 
     { 

      var responseResult= httpClient.GetAsync(doc.FileURLPath); 
      using (var memStream = responseResult.Result.Content.ReadAsStreamAsync().Result) 
      { 
       using (var fileStream =File.Create($"{filePath}\\{doc.FileName}")) 
       { 
        memStream.CopyTo(fileStream); 
       } 

      } 
     }); 
+0

में वापस रखने से पहले झूठी यह वास्तव में इस समस्या को संबोधित करने वाली एकमात्र पोस्ट है। किक गधा धन्यवाद आदमी। +1 –

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