반응형
해당 포스팅은 개인적으로 C# WPF를 공부하면서 익힌 내용을 기억에 남기기 위한 작업의 일환으로 작성된 글로서
일부 내용에 오류가 있을 수도 있으니 참고하시기 바랍니다.

 

 

C#WPF 프로그래밍에서 
Thread와 비동기
프로그래밍에 대해
알아보자.

 

반응형
내용 요약

 

C# WPF (Windows Presentation Foundation)에서 MVVM (Model-View-ViewModel) 패턴을 사용할 때, 스레드(Thread)와 비동기 프로그래밍은 매우 중요한 개념이다. WPF는 UI 스레드와 백그라운드 스레드를 구분하여 UI의 응답성을 유지하면서도 긴 작업을 수행할 수 있도록 한다. 이 글에서는 MVVM 패턴에서 스레드를 사용하는 기본적인 내용과 예시를 통해 알아보도록 하자.

 

목차
1.MVVM 패턴 개요
2.Thread의 필요성
3.Thread 사용 예시
4.비동기 프로그래밍
5.UI 업데이트
6.결론
1.MVVM 패턴 개요

MVVM 패턴은 WPF 애플리케이션에서

UI와 비즈니스 로직을 분리하는 데 도움을 준다.

이 패턴은 다음과 같은 세 가지 구성 요소로 나뉘어 진다.

 

1.Model: 데이터와 비즈니스 로직을 포함한다.

2.View: 사용자 인터페이스(UI)를 정의한다.

3.ViewModel: View와 Model 간의 상호작용을 관리한다.

 

ViewModel은 데이터 바인딩을 통해 View와 연결된다.

 

2.Thread의 필요성

 

WPF 애플리케이션은 UI 스레드에서 실행된다.

긴 작업(예: 데이터베이스 쿼리, 파일 I/O 등)을 UI 스레드에서 실행하면 UI가 응답하지 않게 된다.

따라서 이러한 작업은 백그라운드 스레드에서 실행해야 한다.

이를 통해 UI는 사용자 입력에 즉시 반응할 수 있게 된다.

 

3.Thread 사용 예시

 

다음은 WPF MVVM 패턴에서 스레드를 사용하는 간단한 예시이다.

이 예시는 버튼 클릭 시 백그라운드에서 긴 작업을 수행하고,

작업이 완료되면 UI를 업데이트하는 방법을 보여준다.

 

# Model

public class DataModel
{
    public string Data { get; set; }
}

 

# ViewModel
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;

public class MainViewModel : INotifyPropertyChanged
{
    private string _status;
    public string Status
    {
        get { return _status; }
        set
        {
            _status = value;
            OnPropertyChanged(nameof(Status));
        }
    }

    public void LongRunningTask()
    {
        Status = "작업 시작...";
        Task.Run(() =>
        {
            // 긴 작업 시뮬레이션
            Thread.Sleep(5000); // 5초 대기
            Status = "작업 완료!";
        });
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

 

# View(XAML)
<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="200" Width="300">
    <Grid>
        <Button Content="작업 시작" Command="{Binding LongRunningTask}" Width="100" Height="30" />
        <TextBlock Text="{Binding Status}" Margin="10,50,10,10" />
    </Grid>
</Window>

 

4.비동기 프로그래밍

 

위의 예시에서는 Task.Run을 사용하여 비동기적으로 작업을 수행하였다.

비동기 프로그래밍은 UI 스레드가 차단되지 않도록 하여 사용자 경험을 향상시킨다.

C#에서는 async await 키워드를 사용하여 비동기 메서드를 쉽게 작성할 수 있다.

 

public async void LongRunningTaskAsync()
{
    Status = "작업 시작...";
    await Task.Run(() =>
    {
        // 긴 작업 시뮬레이션
        Thread.Sleep(5000); // 5초 대기
    });
    Status = "작업 완료!";
}

 

5.UI 업데이트

 

WPF에서는 UI 요소를 업데이트할 때 UI 스레드에서만 수행해야 한다.

위의 예시에서 Status 속성을 업데이트할 때, 

INotifyPropertyChanged 인터페이스를 사용하여 UI에 변경 사항을 알린다. 

Task.Run 내에서 UI를 직접 업데이트하면 예외가 발생하므로,

UI 업데이트는 항상 UI 스레드에서 수행해야 한다.

 

6.결론

 

WPF MVVM 패턴에서 스레드를 사용하는 것은

UI의 응답성을 유지하는 데 필수적이다.

비동기 프로그래밍을 통해 긴 작업을 백그라운드에서 실행하고,

UI는 사용자와의 상호작용을 계속할 수 있게 된다.

 

이 글에서는 기본적인 스레드 사용법과 비동기 프로그래밍을 통해 MVVM 패턴에서의 스레드 활용을 설명하였다.

이러한 개념을 바탕으로 더 복잡한 애플리케이션을 개발할 수 있을 것으로 생각된다.

 

 

반응형

+ Recent posts