특정 함수가 콜이 되면 몇초 이후에 다른 함수를 호출하고 싶다. timer 이외에 다른 방법이 없을까?
MAUI 함수 호출 지연 방법 비교
기존의 System.Timers.Timer나 System.Threading.Timer는 객체 수명 관리나 스레드 컨텍스트 전환(UI 스레드 접근 시) 등에서 번거로울 수 있습니다. MAUI와 .NET 환경에서 가독성과 비동기 처리 효율을 높일 수 있는 더 세련된 방법 3가지를 제안해 드립니다.
1. Task.Delay (가장 추천하는 방법)
C#의 비동기 프로그래밍 모델(Async/Await)을 사용하는 가장 표준적이고 깔끔한 방법입니다.
- 장점: 코드가 순차적으로 읽히므로 가독성이 매우 좋습니다. 별도의 콜백 함수를 만들 필요 없이 흐름 그대로 작성 가능합니다.
- 특징: UI 스레드를 차단(Block)하지 않으므로 앱이 멈추지 않습니다.
public async Task ProcessPowerDeviceDataAsync()
{
// 1. 첫 번째 함수 실행 (예: BTLE 연결 요청)
ConnectToDevice();
// 2. 3초 대기 (UI 멈춤 없음)
// 3000 밀리초 = 3초
await Task.Delay(3000);
// 3. 지연 후 실행할 함수 (예: 상태 정보 요청)
RequestStatusInfo();
}
MAUI 개발자 Tip: 페이지가 닫히거나 작업이 취소되어야 할 때를 대비해 CancellationToken을 함께 사용하면, 대기 중에 리소스를 안전하게 해제할 수 있어 BTLE 통신 안정성에 도움이 됩니다.
2. Dispatcher.DispatchDelayed (UI 관련 작업일 경우)
MAUI의 IDispatcher 기능을 사용하여 UI 스레드 큐에 작업을 예약하는 방식입니다.
- 장점: 지연 후 실행되는 코드가 반드시 UI 스레드에서 실행되어야 할 때(예: 화면의 라벨 변경, 알림 표시) 안전합니다.
- 특징: 별도의 await 없이 "예약"만 걸어두고 코드는 바로 다음 줄로 넘어갑니다.
public void OnDeviceConnected()
{
// 첫 번째 함수 실행
UpdateStatusLabel("Connecting...");
// 3초 뒤에 실행할 작업을 메인 스레드(UI) 큐에 예약
Application.Current.Dispatcher.DispatchDelayed(TimeSpan.FromSeconds(3), () =>
{
// 3초 뒤 실행될 코드 (UI 업데이트 가능)
UpdateStatusLabel("Connection check required.");
CheckConnectionHealth();
});
// 이 줄은 3초를 기다리지 않고 바로 실행됩니다.
}
3. Reactive Extensions (Rx.NET) (BTLE 통신에 강력 추천)
BTLE 통신은 본질적으로 데이터가 스트림 형태로 들어옵니다. 만약 프로젝트에 System.Reactive (Rx.NET) 라이브러리를 사용 중이라면 이 방법이 가장 강력합니다.
- 장점: 타이머뿐만 아니라 데이터 필터링, 스로틀링(Throttling), 타임아웃 처리를 일관된 방식으로 할 수 있습니다.
- 상황: "데이터가 들어온 지 3초가 지나도 응답이 없으면 재연결한다" 같은 로직을 짤 때 탁월합니다.
using System.Reactive.Linq;
public void SetupAutoRequest()
{
// 첫 번째 함수 실행
StartScanning();
// 3초 뒤에 스트림을 발생시켜 함수 실행
Observable.Timer(TimeSpan.FromSeconds(3))
.Subscribe(_ =>
{
// 백그라운드 스레드에서 실행될 수 있으므로 UI 접근 시 MainThread 호출 필요
MainThread.BeginInvokeOnMainThread(() =>
{
RequestHistoryLogs();
});
});
}
요약 비교
| 방법 | 추천 상황 | 코드 복잡도 | UI 스레드 처리 |
| Task.Delay | 일반적인 지연 실행 (가장 추천) | 낮음 (깔끔함) | 자동 (Context 유지) |
| Dispatcher | 단순 UI 업데이트 지연 | 매우 낮음 | 보장됨 |
| Rx.NET | 복잡한 BTLE 데이터 스트림 제어 | 높음 (학습 필요) | 별도 처리 필요 |
LIST
'MAUI' 카테고리의 다른 글
| MSVS에 빌드 옵션에 Android 로컬 디바이스가 표시되지 않을 때 (0) | 2025.12.08 |
|---|---|
| MAUI 상대/절대 경로 설명 (0) | 2025.11.24 |
| MAUI TabbedPage와 Shell 사용 비교 (0) | 2025.10.16 |
| MAUI BTLE InTheHand Client Sample. part2 (0) | 2025.10.16 |
| MAUI BTLE InTheHand Client Sample Code (0) | 2025.10.14 |