[MAUI] Release 모드에서 비동기 코드를 실행하면 죽는 경우

[Android]

  1. Debug모드로 앱을 실행하면 잘 동작합니다.
  2. Release로 배포하여 앱을 실행하면 죽는 경우가 많이 생깁니다.
  3. 죽는 주된 원인으로 TaskCanceledException으로 예상하고 있습니다.
  4. 해결 방법으로는 MainThread.BeginInvokeOnMainThread를 사용하는 것입니다.

[Android]

image

Visaul studio에서 Debug 모드로 돌리고 Real device에 usb로 연된 상태로 앱을 돌리면 문제가 없습니다.
Release 모드로 배포를하고 앱을 사용하거나, Usb 선을 뽑고 device에서 앱을 바로 실행하면 앱이 죽는 경우가 생깁니다.
이 경우 주로 발생하는 ExceotionTaskCanceledException 입니다.

지금 개발하는 앱이 주로 죽는 경우는 비동기 매소드에 await를 활용한 부분이 였는데요.
이러한 경우 MainThread.BeginInvokeOnMainThread를 사용하여 메인 쓰레드에 같이 태워보내면
큰 문제 없이 동작하는 것을 확인 했습니다.


궁금한 것은 Visual studio와 같이 Device를 돌릴 때와 Release 모드로 배포하여 실행할 때 차이점,
MainThread.BeginInvokeOnMainThread를 남용 했을 때 생기는 장단점(효과)입니다.

1개의 좋아요

image
Stack Overflow

1개의 좋아요

Release의 최적화에 따라 다르게 동작할 여지는 있으나 일반적으로 동일하게 동작해야만 합니다.

메인 스레드에서 코드를 실행하도록 합니다. UI 앱의 경우 메인 스레드는 일반적으로 UI 스레드이며, UI에 관련된 동작은 메인스레드에서 일반적으로 처리되어야만 합니다. 그렇지 않을 경우 오동작을 합니다.

제가 자마린 또는 MAUI를 적극적으로 개발하고 있는 시점은 아니여서 정확한 특성을 말씀드리기는 어려우나 일반적으로 보았을 때 관련된 이슈는 디바이스의 문제보다는 디바이스의 정보를 표현할 때 UI 스레드가 아닌 다른 스레드에서 UI 관련된 작업을 하려 했을 때 생기지 않을까 추측해 봅니다.

3개의 좋아요

CollectionView에 Item을 추가하는 것이니 UI에 관련이 있는 것 같습니다.
해당 문제는 Thread block에서 일어나는 것 같습니다.
단순히 Task.Run(AddItem);을 사용하면 AddItem 매소드가 돌지 않습니다.
여기서 Task.Wait()를 추가하면 바로 앱이 죽습니다.

// 앱 종료...
Task.Run(AddItem);
Task.Wait();

------------------------------------------------

//(또는 AddItem에 `await`가 있으면 
Task.Run(AddItem);

async Task AddItem()
{
   await ...
}

"멈출수 없는 곳에서 멈출려고 하지 마세요"라는 느낌이네요

1개의 좋아요