위에 다른분들이 좋은 방법을 말씀해주셔서 저는 제가 이해했던 방법을 한번 말해볼게요.
저는 아래와 같은 코드를 작성해보고 이해했었습니다.
void async FooAsync()
{
Task.Run(() => { while(true){ } });
Task.Run(() => { while(true){ } });
Task.Run(() => { while(true){ } });
}
void async Foo2Async()
{
await Task.Run(() => { while(true){ } });
Task.Run(() => { while(true){ } });
Task.Run(() => { while(true){ } });
}
위 코드는 어떻게 동작할까요? 첫번째 Foo는 3줄이 모두 동작 되고 Foo2는 await에서 해당 Task가 완료 되기를 기다립니다. 이러면 아래에 있는 Task가 동작하지 않습니다.
두 foo 모두 UI Thread를 사용하지 않기 때문에 UI가 멈추지는 않습니다. 여기서 await이 어떻게 동작하는지 이해했었습니다. 더 자세한건 구글링하면서 공부하면 금방 이해하실 수 있습니다.
이제 다른 이야기를 해보죠. 먼저 작성자분의 문제를 저도 고민해본 입장에서 해답은 아닐지라도 저는 이렇게 생각했었고 어떻게 해결했는지 적어볼게요.
가장 중요한 키워드는 이것이 아닐까요?
기존) 1:1 PLC 통신
변경) 1:N PLC 통신
자 여기서 1:1 PLC 통신은 그냥 하면 되었습니다.
그러다보니 1:1 통신을 여러개 만들어서 그냥 Thread에 넣고 돌리면 되는거아니야? 라는 생각을 하게 됩니다. 그래서 찾아보니 Task/await을 사용해서 async를 구현 하면 되겠네? 라는 생각을하고, 그래서 찾아보니 Socket에서 Async 기능이 있네? 이걸로 구현하면 되겠다. 라는 생각까지 도달합니다.
근데 여기가 잘못된 접근 방법이죠. 1:N 통신은 device들의 스케쥴링이 필요한것이지 통신 그 자체의 비동기가 필요한것이 아닙니다.
즉, socket의 async 기능이 필요 한것이 아니라 Object를 N개를 만들고 이것들을 Task/await으로 관리하는 해결법이 필요하게 됩니다.
저는 device 관리 하는 방법으로 이 문제를 해결 했었고 여기서 마이크로서비스 아키텍처를 참고하고 적용하려고 노력했던것 같습니다.