여러개의 Task 중 하나가 Exception 되었을 때 catch 하는 방법

이전에 Task Exception 처리를 도움 받아서 새로 짯습니다.

public async void Foo(List<Task> tasks)
{
    var task = Task.WhenAll(tasks);

    try
    {
        await task;
    }
    catch (Exception)
    {
        if (task.Exception is not null)
        {
            foreach(var item in tn task.Exception.InnerExceptions)
            {
                    // Send Log
            }
         }
      }

이렇게 바꿧습니다. 여기서 문제가 Exception이 tasks의 모든 Task가 종료 될때 한번에 처리 됩니다.
제가 원하는 상태는 각각의 Task가 동작하며, Exception이 생긴다면 해당 Task의 Exception을 바로 처리하고 싶습니다.

예를 들어,

이름     연결상태
Device 1 (O)
Device 2 (O)
Device 3 (O)

이렇게 표시 되는 도중에 각각의 Device 들의 연결 상태를 tracking 하고 싶은데요.

이름    연결상태
Device 1 (X)
Device 2 (O)
Device 3 (O)

이렇게 변한다면 Device 1이 연결이 끊겼다고 알려주고 싶습니다. 어떤 방법으로 해결해야 할까요?

1개의 좋아요

저런 상태를 체크하려면
밖깥쪽 호출 부분에서 예외처리로 체크하는 것이 아니고
실제 Task에서 연결상태 Close 를 이벤트로 통보해줘야 하는거 아닌가요?

2개의 좋아요

이렇게 처리하고 있습니다. 어떤게 적합한 처리방법인지 모르겠습니다 ㅠㅠ

public async void Foo(List<Task> tasks)
{
    var task = Task.WhenAll(tasks);

    try
    {
        await task;
    }
    catch (Exception)
    {
        if (task.Exception is not null)
        {
            foreach(var item in tn task.Exception.InnerExceptions)
            {
                    // Send Log
            }
         }
      }
}
void ExecuteFooCommand()
{
    var tasks = new List<Task>();
    Task task;
    ...
    foreach (var device in devices)
    {
        task = ConnectionMonitor(device);
        tasks.Add(task);
    }

    if (tasks.Count > 0) Foo(tasks);
}
public static async Task ConnectionMonitor(Device device)
{
    await Task.Run(() =>
    {
        while(!token.IsCancellationRequested)
        {
             // Tcp연결이 끊기면 Exception
             if (client.Poll(-1, SelectMode.SelectRead))
             {
                 throw new Exception();
             }
        }
    }
}
1개의 좋아요

정확히 현재 상황은 모르겠지만, 실시간으로 상태를 감지시키려면
적어도 await Task 의 예외처리로는 실시간 감지는 할 수 없을거 같습니다.
모든 작업 완료 대기이기에 예외또한 그때 잡히겠지요

단순히 생각하면

device 목록 및 모니터링 상태 정보를 가시화 처리에 필요한 정보를 하나의 모델로 만드시고

모델에 현재 상태 정보를 갖게 합니다.

그럼 devices 라는 모델의 리스트를 만들어서 그 리스트를 가지고 제어하면 될거같습니다.

그리곤 모니터링 쪽에서는

throw 처리가 아닌 상태의 정보를 바꿔줍니다.

사용자에게 보여지는 부분에선 저 상태값만 갱신하면 되지 않을까 합니다.

4개의 좋아요