9H05T
1
이전에 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개의 좋아요
9H05T
3
이렇게 처리하고 있습니다. 어떤게 적합한 처리방법인지 모르겠습니다 ㅠㅠ
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개의 좋아요