HttpWebRequest এবং TPL (টাস্কগুলি) ব্যবহার করে অগ্রগতি আপডেটগুলি গ্রহণ করা হচ্ছে

আমি একটি পৃথক থ্রেড উপর একটি স্থান গ্রহণের অগ্রগতি ট্র্যাক করতে চান। আমি জানি যে System.Net.WebClient একটি DownloadStringAsync পদ্ধতি আছে, কিন্তু এটি নতুন TPL প্রকার (TaskFactory, Task, ইত্যাদি) সঙ্গে সরাসরি কাজ করে না।

  • HttpRequest এবং HttpResponse ক্লাস ব্যবহার করে অগ্রগতি ট্র্যাক করা যেতে পারে? করুন
  • ট্র্যাকিং অগ্রগতির সেরা ক্লাস কি? কম ওভারহেড ভাল।
  • এমন সময় আছে যখন প্রতিক্রিয়াটির আকার অজানা, উর্দ্ধা, অগ্রগতি ট্র্যাক করা যাবে না? করুন
  • যখনই অগ্রগতি তৈরি হয় তখন UI থ্রেটার সাথে সিঙ্ক্রোনাইজ করার সেরা উপায় কি?

বেশিরভাগ উদাহরণ সমগ্র টাস্ক সম্পন্ন হওয়ার পরেই কেবল UI আপডেট করার কাজ দেখায়। এই উদাহরণগুলি একটি UI সিঙ্ক্রোনাইজেশনের প্রেক্ষাপটে গ্রহণের ধারাবাহিকতাগুলি ব্যবহার করে যা Dispatcher- এর সাথে সরাসরি কাজ করার প্রয়োজন থেকে বিরত থাকে।

ধারণা হল গ্রিড ভিউ (WPF) দেখানোর জন্য অগ্রগতি বার সহ সব ডাউনলোডের সাথে। আমি নতুন সারি যোগ এবং সব সময় অগ্রগতি বার আপডেট করতে যাচ্ছি। আমি এই কোড একটি জগাখিচুড়ি মধ্যে বাঁক এড়ানোর চেষ্টা করছি।

0

1 উত্তর

DownloadStringAsync এবং অন্যান্য ইভেন্ট পদ্ধতি টিএপিএল এর সাথে খুব ভাল কাজ করে। NET 4.0 (EAP এবং TPL এর জন্য চেক করুন)। সাধারণভাবে, TPL TaskCompletionSource এর মাধ্যমে ইভেন্টের এস্যানিক প্রোগ্রামিং সমর্থন করে। Task.FromAsync পদ্ধতির মাধ্যমে শুরু/শেষ XXX মডেল (APM) সমর্থিত। আপনি একটি বিস্তারিত বিবরণ TPL এবং ঐতিহ্যগত। NET অসিঙ্ক্রোনাস প্রোগ্রামিং খুঁজে পেতে পারেন।

ParallelExtensionExtras লাইব্রেরিতে ওয়েব ক্লায়েন্ট এক্সটেনশনগুলির একটি সেট আছে এমন পদ্ধতি যা ডাউনলোড স্ট্রিং টাস্কের কাজ করে যা সঠিক কাজটি সম্পন্ন হওয়ার পরেই সমাপ্ত হয়।

নিম্নোক্ত কোডটি একটি টাস্ক তৈরি করবে যা ডাউনলোড শেষ হলে সম্পন্ন হবে:

    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;
    }

UI আপডেট করার জন্য, আপনি প্রতিক্রিয়া প্রদান করতে সহজেই Downloadprogress চেনডেন ইভেন্টটি ব্যবহার করতে পারেন, যেমন:

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();
}

আপনার অগ্রগতি বারগুলির অগ্রগতি মানগুলি প্রদান করার জন্য আপনি যদি তথ্য বাঁধার ব্যবহার করেন তবে আপনি কেবল অগ্রগতি মান বৈশিষ্ট্যগুলি আপডেট করতে পারেন। আপনি যদি অগ্রগতি বার সরাসরি (কোনও ভাল ধারণা না) আপডেট করেন তবে অগ্রগতি বারের প্রেরক ব্যবহার করে আপনি UI থ্রেডে কল করতে মার্শাল করবেন। এটার মত

    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
যোগ