본문 바로가기

Windows

c# WPF UI 작업관련

반응형

WPF에서 UI를 업데이트 하면서 작업을 한는 방법이 몇가지 있습니다.

제일 먼저 하는 것이 BackgroundWorker 입니다.

private void Button_Click(object sender, RoutedEventArgs e)
{
	BackgroundWorker worker = new BackgroundWorker();
	worker.WorkerReportsProgress = true;
	worker.DoWork += delegate (object s, DoWorkEventArgs args)
	{
		WorkProcess(s);
	};

	worker.ProgressChanged += delegate (object s, ProgressChangedEventArgs args)
	{
		ProgressBar.Value = args.ProgressPercentage;
	};

	worker.RunWorkerCompleted += delegate (object s, RunWorkerCompletedEventArgs args)
	{
		DoneProcess();
	};

	//_busyIndicator.IsBusy = true;
	worker.RunWorkerAsync(10000);
}
	
private void WorkProcess(object sender)
{
	int max = (int)e.Argument;
	int result = 0;
	for(int i = 0; i < max; i++)
	{
		int progressPercentage = Convert.ToInt32(((double)i / max) * 100);
		if(i % 42 == 0)
		{
			result++;
			(sender as BackgroundWorker).ReportProgress(progressPercentage, i);
		}
		else
			(sender as BackgroundWorker).ReportProgress(progressPercentage);
		System.Threading.Thread.Sleep(1);
	}
	e.Result = result;
}

private void DoneProcess()
{
}

위는 버튼을 눌렀을 때 BackgroundWorker를 호출하여 작업하는 예제입니다.

BackgroundWorker의 단점은 느리다는 점입니다. 특히 여러개의 프로그램을 동시에 실행시에 현격히 느려지게 되어 UI가 업데이트 안되는 경우도 있습니다.

 

두번째는 DispatcherTimer를 사용하는 방법입니다.

위의 예제처럼 루프를 돌리는 경우 이처리를 DispatcherTimer로 한번씩 호출되게 만드는 것입니다.

private DispatcherTimer dataGatheringTimer;
dataGatheringTimer = new DispatcherTimer(DispatcherPriority.Render);
dataGatheringTimer.Interval = TimeSpan.FromTicks(100);
dataGatheringTimer.Tick += new EventHandler(DataGatheringCallback);

private void Button_Click(object sender, RoutedEventArgs e)
{
	StartProcess();
}

int iCurrent, max;

private void StartProcess()
{
	max = 10000;
	iCurrent = 0;
    dataGatheringTimer.Start();
}

private void DataGatheringCallback(object sender, EventArgs e)
{
	if(iCurrent < max)
	{
		int progressPercentage = Convert.ToInt32(((double)i / max) * 100);
		if(i % 42 == 0)
		{
			result++;
			(sender as BackgroundWorker).ReportProgress(progressPercentage, i);
		}
		else
			(sender as BackgroundWorker).ReportProgress(progressPercentage);
	}
	else
	{
		dataGatheringTimer.Stop();
	}
}

 

이렇게하면 좀더 빠른 업데이트가 됩니다.

 

반응형

'Windows' 카테고리의 다른 글

노트북에 설치된 Windows10 제품키 확인  (0) 2021.01.27
office 2019 odt 설치  (0) 2021.01.25
C# WPF ListView Column Header Tooltip.  (0) 2020.08.28
Ahnlab Safe Transaction  (2) 2020.08.25
Windows10에서 메모장이 사라진 경우  (0) 2020.08.04