C#-BackgroundWoker 작업

3557 단어
C#의 Background Woker는 GUI에서 다중 스레드를 대체하는 데 사용되는 것이 비교적 이상적인 실현 방식이다.BackgroundWorker를 사용하는 방법에 대한 자세한 내용은 다음과 같습니다.
Background Woker에는 DoWork,ProgressChanged,RunWorkerCompleted가 각각 백그라운드에서 이벤트를 처리하고 진행 보고와 이벤트를 처리하는 데 사용된다.
DoWork의 위임 형식은 void(object sender, DoWork EventArgs args)입니다.이 의뢰는 백엔드 라인에서 처리해야 할 일을 처리하는 데 사용됩니다.또한 이 의뢰에서 BackgroundWorker를 사용해야 하는CancellationPending 속성으로 사용자를 검사할 때 백엔드 라인을 취소하고, 백엔드 라인을 취소하려면 DoWork EventArgs의Cancel 속성을true로 설정해야 한다. 그러면 RunWorker Completed 이벤트에서 백엔드 라인이 정상적으로 종료되었는지 사용자가 종료되었는지 확인할 수 있다.
ProgressChanged의 위임 형식은 void(object sender, ProgressChanged Event Args args)입니다.이 위탁 사용자는 사용자에게 현재 라인의 진도를 보고합니다.특정 진행률은 PorgressChangedEventArgs 매개 변수의 ProgressPercentage 속성에서 얻을 수 있으며 이 속성은 1부터 100까지의 Int입니다.주의해야 할 것은 DoWork 의뢰에서 Background Woker의 Report Progress () 방법을 사용한 후에만 Progress Changed 이벤트를 출발할 수 있으며, 이 방법은 1부터 100까지의 Int 파라미터를 받아들인다는 것이다.
RunWorker Completed의 위임 형식은void(object sender, RunWorker Completed Event Argsargs)입니다.이 위임 사용자는 BackgroundWorker가 완료되면 호출(트리거)합니다.RunWorker Completed EventArgs 매개 변수의 cancel 속성을 검사하면 정상적으로 종료되었는지 사용자가 종료되었는지 확인할 수 있습니다.
BackgroundWorker 클래스의 일반적인 방법으로는 RunWorker Async(), Cancel Async(), ReportProgress()가 있습니다.RunWokerAsync() 메서드는 백그라운드 스레드를 시작하는 데 사용됩니다.Cancelasync () 방법은 스레드를 종료하는 데 사용되지만, 그는 실제로 스레드를 종료하지 않고, BackgroundWorker의 CancellationPending 속성을 ture로 수정한 다음, DoWork 이벤트에서 이 속성을 검출함으로써 백엔드 스레드를 종료합니다.ReportProgress는 ProgressChanged 이벤트를 트리거하는 데 사용되며, DoWork에서 ReportProgress () 방법을 호출하지 않으면 ProgressChanged 이벤트가 발생하지 않습니다.
   
BackgroundWorker 클래스의 상용 속성은CancellationPending, IsBusy,WorkerReportsProgressWorkerSupportsCancellation입니다.그들은 모두 bool형이다.CancellationPending은 현재 백그라운드 스레드를 종료할지 여부를 나타냅니다.IsBusy 는 현재 백그라운드 스레드가 실행 중임을 나타냅니다.앞의 이 두 가지는 모두 읽기 전용형이다.Worker Reports Progress는 진행 상태 보고서가 지원되는지 여부를 나타냅니다.WorkerSupportsCancellation은 백엔드 스레드 터미널이 지원되는지 여부를 나타냅니다.
다음 예는 다음과 같습니다.
using System;
using System.ComponentModel;
using System.Threading;

namespace Ch22
{
	class WebData
	{
		private BackgroundWorker bgWorker;

		public WebData()
		{
			bgWorker=new BackgroundWorker();
			
			bgWorker.WorkerSupportsCancellation=true;
			bgWorker.WorkerReportsProgress=true;
			bgWorker.DoWork+=GetData;
			bgWorker.RunWorkerCompleted+=Complete;
			bgWorker.ProgressChanged+=ReportProgress;
		}
		public void Start()
		{
			if(bgWorker!=null)
			{
				bgWorker.RunWorkerAsync();	
			}
		}
		public void Cancel()
		{
			if(bgWorker.IsBusy)
			{
				try
				{
					bgWorker.CancelAsync();
				}
				catch(Exception e)
				{
					Console.WriteLine(e.Message);	
				}
			}
		}
		private void GetData(object sender,DoWorkEventArgs args)
		{
			for(int i=0;i<100;i++)
			{
				if(bgWorker.CancellationPending)
				{
					args.Cancel=true;
					break;
				}
				bgWorker.ReportProgress(i);
				Thread.Sleep(1000);
			}
		}
		private void Complete(object sender,RunWorkerCompletedEventArgs args)
		{
			if(args.Cancelled)
			{
				Console.WriteLine("BackgroundWorker has been Cancelled");
			}
			else
			{
				Console.WriteLine("BackgroundWoker has completed");
			}
		}
		private void ReportProgress(object sender,ProgressChangedEventArgs args)
		{
			Console.SetCursorPosition(0,3);
			Console.WriteLine("Geting Data...{0}%",args.ProgressPercentage);	
		}
	}
	class Program
	{
		public static void Main()
		{
			WebData bg=new WebData();	

			bg.Start();
			while(true)
			{
				if(Console.KeyAvailable)
				{
					Console.ReadKey();
					bg.Cancel();
				}
			}
		}
	}
}

좋은 웹페이지 즐겨찾기