2010-02-24 13 views
5

से डाउनलोड प्रगति कैसे दिखाएं मैं एक एफ़टीपी साइट (Async) से एक फ़ाइल डाउनलोड कर रहा हूं और प्रगति पट्टी को अपडेट करने की आवश्यकता है। मैंने एमएस दस्तावेज पढ़ा है जो बताता है कि यह किया जा सकता है कि वेब क्लाइंट क्लास का GetWebRequest() ovverriden है इसलिए 'UsePassive' प्रॉपर्टी 'false' पर सेट है। मैंने यह किया है लेकिन 'डाउनलोड प्रोग्रेस चेंज' घटना तर्क प्रगतिप्रदर्शन हमेशा == '0' है।एफ़टीपी

क्या कोई मुझे बता सकता है कि इस तर्क को मूल्य वापस करने के लिए कैसे प्राप्त किया जाए?

class FTPClient : WebClient 
    { 
     protected override WebRequest GetWebRequest(System.Uri address) 
     { 
      FtpWebRequest req = (FtpWebRequest) base.GetWebRequest(address); 
      req.UsePassive = false; 
      return req; 
     } 
    } 

और मेरी कॉलबैक अगर यह मदद करता है::

  FTPClient request = new FTPClient(); 
      request.Credentials = new NetworkCredential(user, password); 
      request.DownloadProgressChanged += UpdateProgress; 
      request.DownloadFileAsync(ftpepath,destinationpath); 

यह FTPClient (जहां मैं GetWebRequest() अधिभावी कर रहा हूँ) है:

यह डाउनलोड विधि है

void UpdateProgress(object sender, DownloadProgressChangedEventArgs e) 
     { 
      dwnProgress.Value = e.ProgressPercentage; 
      dwnprcnt.Text = PercentProgress.ToString() + "%"; 
     } 
+0

देखें प्रगति आप तो यह इसके लिए या वेब पेज है कि क्या आवेदन की यूआई ब्लॉक करता है एक अलग थ्रेड में फ़ंक्शन को कॉल करने के लिए है दिखाने के लिए। –

उत्तर

3

UsePassive का उपयोग "निर्धारित" करने के लिए किया जाता है जो सर्वर के रूप में कार्य करता है जब फ़ाइल स्थानांतरण के लिए कनेक्शन बनाया जाता है , इसलिए स्थानांतरण की वास्तविक स्थिति के साथ इसका कोई संबंध नहीं होना चाहिए। क्या मैं पूछ सकता हूं कि आपने यह कहां पढ़ा है?

यह हो सकता है कि

  • परिवर्तन एक बड़ी फ़ाइल के लिए बहुत छोटा है, तो आप percentagechanged नहीं दिखाई देता?
  • कि फ़ाइल ftpwebrequests आंतरिक बफर से छोटी है, तो आपको किसी भी "अद्यतन" से पहले पूरी फ़ाइल मिलती है?

क्या आप अपडेट प्रोग्रेस में ब्रेकपॉइंट सेट कर सकते हैं और किसी भी ई-प्रॉपर्टी में कुछ भी देख सकते हैं?

और एक साइड नोट के रूप में, क्योंकि आप फ़ाइल async डाउनलोड कर रहे हैं, वास्तविक डाउनलोड के लिए एक और थ्रेड का उपयोग किया जाता है।

void UpdateProgress(object sender, DownloadProgressChangedEventArgs e) { 
    setProgress(e.ProgressPercentage); 
    setText(e.ProgressPercentage.ToString() + "%"); 
} 

private void setProgress(int progress){ 
    if (dwnProgress.InvokeRequired) { 
     dwnProgress.Invoke(new Action<int>(setProgress), progress); 
     return; 
    } 
    dwnProgress.Value = progress; 
} 

private void setText(string text) { 
    if (dwnprcnt.InvokeRequired) { 
     dwnprcnt.Invoke(new Action<string>(setText), text); 
     return; 
    } 
    dwnprcnt.Text = text; 
} 

कौन सा बजाय यूआई धागा करने के लिए setmethods कतार होगा: आपके घटना विधि में आप शायद कुछ इस तरह करना चाहते हैं।

2

मैं ऊपर पोस्ट करने के लिए एक टिप्पणी छोड़ने के लिए चाहता था, लेकिन मैं भी नया हूँ :(

वेब अनुरोध विधि अधिभावी पर MSDN के संदर्भ: ऑप्स के लिए

http://msdn.microsoft.com/en-US/library/system.net.webclient.downloadprogresschanged(v=vs.80).aspx

हालांकि जवाब में

सवाल है कि क्या आपका एफ़टीपी सर्वर सक्रिय कनेक्शन स्वीकार करने के लिए सेट नहीं है, तो WebClient.UsePassive = false को कोई फर्क नहीं पड़ता।

संपादित करें: मैंने सिस्टम प्रोजेक्ट को सक्षम किया है। मेरी परियोजना पर ट्रेसिंग और दोनों को निष्क्रिय करने की कोशिश की डी सक्रिय मोड और न केवल दोनों काम के रूप में काम करते हैं ... कुल बाइट्स अभी भी -1 है इसलिए मेरी सोच गलत में एमएसडीएन पर नोट है या हम कुछ खो रहे हैं

डाउनलोडफाइल प्रोग्रेस चेंजएडएन्टएआरजी में कुल बाइट प्राप्त होते हैं और यदि आप जानते हैं फ़ाइल आकार आप स्वयं की गणना कर सकते हैं।

संभवतः एक बेहतर तरीका है ... लेकिन मैंने फ़ाइल आकार प्राप्त करने के लिए एक त्वरित FtpWebRequest का उपयोग किया और फिर प्रगति पट्टी को अद्यतन करने के लिए इसे डाउनलोड प्रोग्रेस कॉलबैक विधि में पास कर दिया।

इसके अलावा उपरोक्त पोस्टर का उल्लेख करने में असफल रहा है कि आपकी अपडेट प्रगति विधि को नियंत्रण का आह्वान करना चाहिए क्योंकि इसे DownloadFileAsync द्वारा बनाए गए थ्रेड द्वारा बुलाया जा रहा है और आप इसे बनाए गए थ्रेड से केवल नियंत्रण ही बदल सकते हैं।

आपको नियंत्रण के लिए प्रेषक का उपयोग करना चाहिए उदा।

if (!myCheckBox.Dispatcher.CheckAccess()) 
{ 
    myCheckBox.Dispatcher.BeginInvoke(new Action(
    delegate() 
    { 
     myCheckBox.IsChecked = true; 
    } 
    )); 
} 
else 
{ 
    myCheckBox.IsChecked = true; 
} 

http://msdn.microsoft.com/en-us/library/ms591206.aspx

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