HttpWebRequest और TPL (कार्य) का उपयोग कर प्रोग्रेस अपडेट प्राप्त करना

मैं एक अलग थ्रेड पर डाउनलोड करने की प्रगति को ट्रैक करना चाहता हूं। मुझे पता है कि System.Net.WebClient में एक डाउनलोडस्ट्रिंगएसिंक विधि है, लेकिन यह सीधे नए टीपीएल प्रकारों (टास्क फैक्ट्री, टास्क इत्यादि) के साथ काम नहीं करती है।

  • HttpRequest और HttpResponse कक्षाओं का उपयोग करके प्रगति की जा सकती है?
  • प्रगति पर नज़र रखने के लिए सबसे अच्छी कक्षा क्या है? कम ओवरहेड बेहतर है।
  • क्या ऐसे समय होते हैं जब प्रतिक्रिया का आकार अज्ञात होता है, उर्फ, प्रगति को ट्रैक नहीं किया जा सकता है?
  • जब भी प्रगति की जाती है तो UI थ्रेड के साथ सिंक्रनाइज़ करने का सबसे अच्छा तरीका क्या है?

अधिकांश उदाहरण संपूर्ण कार्य पूरा होने के बाद ही यूआई को अपडेट करने के कार्य दिखाते हैं। ये उदाहरण यूआई सिंक्रनाइज़ेशन संदर्भ लेने वाली निरंतरता का उपयोग करते हैं जो सीधे डिस्पैचर के साथ काम करने की आवश्यकता से बचाता है।

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

0
जोड़ा
विचारों: 1

1 उत्तर

DownloadStringAsync और अन्य ईवेंट विधियां .NET 4.0 में टीपीएल के साथ बहुत अच्छी तरह से काम करती हैं (ईएपी और टीपीएल की जांच करें)। सामान्य रूप से, टीपीएल कार्यसंगठन स्रोत के माध्यम से ईवेंट async प्रोग्रामिंग का समर्थन करता है। शुरुआत/EndXXX मॉडल (एपीएम) कार्य। FromAsync विधि के माध्यम से समर्थित है। आप विस्तृत विवरण टीपीएल और पारंपरिक .NET असीमित प्रोग्रामिंग प्राप्त कर सकते हैं।

समानांतर एक्सटेंशन एक्सटेंशन लाइब्रेरी में वेब क्लाइंट एक्सटेंशन का एक सेट है डाउनलोडस्ट्रिंग टास्क जैसी विधियां जो एक कार्य लौटाती हैं जो उचित घटना को निकाल दिया जाता है।

निम्न कोड एक कार्य बनाएगा जो डाउनलोड समाप्त होने पर पूरा हो जाएगा:

    public Task DownloadStringTask(WebClient client,Uri uri)
    {
        var tcs = new TaskCompletionSource();
        client.DownloadStringCompleted += (o, a) => tcs.SetResult(a.Result);
        client.DownloadStringAsync(uri);
        return tcs.Task;
    }

यूआई को अपडेट करने के लिए, आप प्रतिक्रिया प्रदान करने के लिए आसानी से DownloadProgressChanged ईवेंट का उपयोग कर सकते हैं, उदाहरण के लिए:

using (var client = new WebClient())
{
    client.DownloadProgressChanged += (o, a) => Console.WriteLine("{0}",a.ProgressPercentage);

    var task = DownloadStringTask(client,new Uri("http://www.stackoverflow.com"));
    var write=task.ContinueWith(t => Console.WriteLine("Got {0} chars", t.Result.Length));
    write.Wait();
    Console.ReadKey();
}

यदि आप प्रगति मूल्यों को प्रगति मूल्य प्रदान करने के लिए डेटा बाइंडिंग का उपयोग करते हैं, तो आप केवल प्रगति मान गुणों को अपडेट कर सकते हैं। यदि आप सीधे प्रगति सलाखों को अपडेट करते हैं (एक अच्छा विचार नहीं), तो आपको प्रगति पट्टी के प्रेषक का उपयोग करके यूआई थ्रेड पर कॉल को मार्शल करना होगा, उदाहरण के लिए। इस तरह

    void UpdateProgress(int percent)
    {
        if (progressBar1.CheckAccess())
            progressBar1.Value = percent;
        else
        {                
            progressBar1.Dispatcher.Invoke(new Action(()=>UpdateProgress(percent)));
        }
    }
    ....
    client.DownloadProgressChanged += (o, a) => UpdateProgress(a.ProgressPercentage);
0
जोड़ा