কীভাবে ডাব্লুপিএফ ব্যাকগ্রাউন্ড ওয়ার্কার ব্যবহার করবেন


177

আমার অ্যাপ্লিকেশনটিতে আমাকে একাধিক সূচনা পদক্ষেপ করা দরকার, এগুলি সম্পূর্ণ করতে 7-8 সেকেন্ড সময় লাগে যার সময়কালে আমার UI প্রতিক্রিয়াবিহীন হয়ে যায়। এটি সমাধান করার জন্য আমি একটি পৃথক থ্রেডে সূচনাটি সম্পাদন করব:

public void Initialization()
{
    Thread initThread = new Thread(new ThreadStart(InitializationThread));
    initThread.Start();
}

public void InitializationThread()
{
    outputMessage("Initializing...");
    //DO INITIALIZATION
    outputMessage("Initialization Complete");
}

আমি দীর্ঘ প্রবন্ধ BackgroundWorkerসম্পাদন করতে কোনও থ্রেড না লিখে আমার আবেদনটি কীভাবে প্রতিক্রিয়াশীল রাখার অনুমতি দেওয়া উচিত সে সম্পর্কে আমি কয়েকটি নিবন্ধ পড়েছি তবে এটি বাস্তবায়নের চেষ্টা করে আমার কোনও সাফল্য হয়নি, কেউ কীভাবে বলতে পারে যে আমি কী করব এই ব্যবহার করে BackgroundWorker?


আমি এই টিউটোরিয়াল দরকারী পাওয়া যায় নি, বেশ সংক্ষিপ্ত উদাহরণ রয়েছে: elegantcode.com/2009/07/03/...
GrandMasterFlush

এই লিঙ্কটিতে ক্লিক করার পরে আমি গোপনীয়তা ত্রুটি পেয়েছি।
লিটলবার্ডি

উত্তর:


319
  1. ব্যবহার যুক্ত করুন
using System.ComponentModel;
  1. পটভূমি কর্মী ঘোষণা করুন :
private readonly BackgroundWorker worker = new BackgroundWorker();
  1. ইভেন্টগুলিতে সাবস্ক্রাইব করুন:
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
  1. দুটি পদ্ধতি প্রয়োগ করুন:
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
  // run all background tasks here
}

private void worker_RunWorkerCompleted(object sender, 
                                           RunWorkerCompletedEventArgs e)
{
  //update ui once worker complete his work
}
  1. আপনার যখনই প্রয়োজন কর্মী অ্যাসিঙ্ক চালান।
worker.RunWorkerAsync();
  1. ট্র্যাক অগ্রগতি (alচ্ছিক, তবে প্রায়শই দরকারী)

    ক) সাবস্ক্রাইব ProgressChangedঘটনা এবং ব্যবহারের ReportProgress(Int32)মধ্যেDoWork

    খ) সেট worker.WorkerReportsProgress = true;(@ জাগিতে ক্রেডিট)


এই পদ্ধতিগুলিতে ডেটা কনটেক্সট অ্যাক্সেস করার কোনও উপায় আছে?
susieloo_

36

আপনি Taskপটভূমি কর্মীদের পরিবর্তে ব্যবহারের দিকেও নজর রাখতে পারেন ।

এটি করার সবচেয়ে সহজ উপায়টি হ'ল আপনার উদাহরণ Task.Run(InitializationThread);

পটভূমি কর্মীদের পরিবর্তে কাজগুলি ব্যবহার করার বিভিন্ন সুবিধা রয়েছে। উদাহরণস্বরূপ, Taskথ্রেডিংয়ের জন্য .NET 4.5 ব্যবহার করে নতুন অ্যাসিঙ্ক / প্রতীক্ষিত বৈশিষ্ট্য । Https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task সম্পর্কে কিছু ডকুমেন্টেশন এখানে রয়েছেTask


11
দুঃখিত এই থ্রেড উদঘাটন, কিন্তু .net 4.0 এবং 4.5 কিছু শান্ত স্টাফ যে ভাবে চেয়ে সহজে ব্যবহারযোগ্য করতে যোগ BackgroundWorker। এটিতে লোকদের চালিত করার প্রত্যাশা।
ওভেন জনসন

1
এখন এই উত্তরটি অতি পুরানো, চেক আউট asyncএবং await। এগুলি আরও বেশি পঠনযোগ্য উপায়ে কার্যগুলি ব্যবহারের ভাষা সমন্বিত উপায়।
ওউন জনসন

14
using System;  
using System.ComponentModel;   
using System.Threading;    
namespace BackGroundWorkerExample  
{   
    class Program  
    {  
        private static BackgroundWorker backgroundWorker;  

        static void Main(string[] args)  
        {  
            backgroundWorker = new BackgroundWorker  
            {  
                WorkerReportsProgress = true,  
                WorkerSupportsCancellation = true  
            };  

            backgroundWorker.DoWork += backgroundWorker_DoWork;  
            //For the display of operation progress to UI.    
            backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;  
            //After the completation of operation.    
            backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;  
            backgroundWorker.RunWorkerAsync("Press Enter in the next 5 seconds to Cancel operation:");  

            Console.ReadLine();  

            if (backgroundWorker.IsBusy)  
            { 
                backgroundWorker.CancelAsync();  
                Console.ReadLine();  
            }  
        }  

        static void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)  
        {  
            for (int i = 0; i < 200; i++)  
            {  
                if (backgroundWorker.CancellationPending)  
                {  
                    e.Cancel = true;  
                    return;  
                }  

                backgroundWorker.ReportProgress(i);  
                Thread.Sleep(1000);  
                e.Result = 1000;  
            }  
        }  

        static void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)  
        {  
            Console.WriteLine("Completed" + e.ProgressPercentage + "%");  
        }  

        static void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)  
        {  

            if (e.Cancelled)  
            {  
                Console.WriteLine("Operation Cancelled");  
            }  
            else if (e.Error != null)  
            {  
                Console.WriteLine("Error in Process :" + e.Error);  
            }  
            else  
            {  
                Console.WriteLine("Operation Completed :" + e.Result);  
            }  
        }  
    }  
} 

এছাড়াও, নীচের লিঙ্কটি উল্লেখ করুন যা আপনি এর ধারণাগুলি বুঝতে পারবেন Background:

http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/


3

@ অ্যান্ড্রুয়ের উত্তর থেকে যে বিবরণগুলি অনুপস্থিত রয়েছে তার বাকি বিশদগুলি ধারণ করার জন্য আমি এটি ( ডাব্লুপিএফ মাল্টিথ্রেডিং: ব্যাকগ্রাউন্ড ওয়ার্কার ব্যবহার করে এবং ইউআইতে অগ্রগতির প্রতিবেদন করা লিঙ্ক ) পেয়েছি।

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

worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
    pd.Close();
    // Get a result from the asynchronous worker
    T t = (t)args.Result
    this.ExampleControl.Text = t.BlaBla;
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.