programing

WPF 백그라운드 작업자 사용 방법

iphone6s 2023. 5. 27. 09:55
반응형

WPF 백그라운드 작업자 사용 방법

애플리케이션에서 일련의 초기화 단계를 수행해야 하는데, 이 단계를 완료하는 데 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?

  1. 추가 방법

    using System.ComponentModel;
    
  2. 백그라운드 작업자 선언:

    private readonly BackgroundWorker worker = new BackgroundWorker();
    
  3. 이벤트 구독:

    worker.DoWork += worker_DoWork;
    worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    
  4. 두 가지 방법을 구현합니다.

    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
    }
    
  5. 필요할 때마다 worker 비동기식을 실행합니다.

    worker.RunWorkerAsync();
    
  6. 진행률 추적(선택 사항이지만 종종 유용함)

    에 가입하다.ProgressChanged이벤트 및 사용ReportProgress(Int32)DoWork

    세트worker.WorkerReportsProgress = true;(@zagy를 가리킴)

다음을 사용하는 방법도 알아 볼 수 있습니다.Task배경 노동자 대신에.

이 작업을 수행하는 가장 쉬운 방법은 다음과 같습니다.Task.Run(InitializationThread);.

백그라운드 작업자 대신 작업을 사용하면 몇 가지 이점이 있습니다.예를 들어 .net 4.5의 새로운 비동기/대기 기능은Task실뜨기용의다음은 에 대한 몇 가지 문서입니다.Task https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task

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/

이것을 찾았습니다(WPF 멀티스레딩: 백그라운드 작업자 사용 및 진행 상황을 UI에 보고합니다. 링크) @Andrew의 답변에서 누락된 나머지 세부 정보를 포함합니다.

한 가지 매우 유용한 점은 작업자 스레드가 (자체 방식으로) 메인 윈도우의 컨트롤에 액세스할 수 없다는 것입니다. 그러나 메인 윈도우 이벤트 핸들러 내에서 대리자를 사용할 때는 가능했습니다.

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

언급URL : https://stackoverflow.com/questions/5483565/how-to-use-wpf-background-worker

반응형