2016-06-09 1 views
5

저는 직렬 통신을 통해 정교한 하드웨어를 제어 할 수있는 상당한 규모의 WPF 애플리케이션을 개발하는 데있어 중요한 방법입니다. 응용 프로그램 "스택"의 맨 아래에는 직렬 통신 계층 (.Net 'SerialPort'클래스 사용)이 있습니다. H/W 장치에 대한 읽기 및 쓰기는 비즈니스 로직 계층의 여러 영역에서 활용되는 시스템의 기본 부분으로 종종 복잡한 과학 계산 및 기타 논리가 산재 해 있습니다. 이러한 BLL 메서드는 차례대로 UI 계층 전체에서 호출됩니다.내 GUI 응용 프로그램에 대해 비동기 "all way"를 사용해야합니까?

현재 SerialPort 읽기 및 쓰기를 포함하여 비즈니스 논리 계층의 모든 것이 동기입니다. async/await을 사용하는 유일한 경우는 일반적으로 비즈니스 로직을 호출 할 때 UI 계층에 있습니다. 여기에 내가 e.g.:-, Task.Run()

private async void SomeButtonClick(object sender, EventArgs e) 
{ 
    await Task.Run(() => _someBLLService.TurnPumpOn()); 
} 

이 밀리 초 단위의 문제를 취하는 간단한 예제를 호출을 래핑 수 있습니다. 보다 복잡한 예제는 장기 실행 프로세스를 시작하는 것입니다 (위의 기술을 다시 사용). 이 비즈니스 로직 "서비스"는 몇 초 또는 몇 분 동안 실행되어 하드웨어에서 데이터를 수집하고이 시간 동안 다른 "제어"기능을 수행합니다. 주기적으로 pubsub 이벤트 수집기 프레임 워크를 통해 차트에 플로팅하기 위해 데이터를 다시 UI로 브로드 캐스팅합니다. 위의 기술은 잘 작동하므로 비즈니스 계층 프로세스가 진행되는 동안 UI가 응답 할 수 있습니다.

최근에는 시리얼 통신 코드 (예 : .ReadAsync 사용)로 시작하여 '비동기로 계속 진행'을 고려하고 있지만 시스템 전체에 영향을 미칩니다. 수십 개 (수백 개는 아니더라도)의 비즈니스 로직 메소드를 비동기 메소드로 리팩토링해야합니다 (UI 계층까지). 여기에 약간 위의 코드를 단순화 할 수있을 것입니다 :

private async void SomeButtonClick(object sender, EventArgs e) 
{ 
    await _someBLLService.TurnPumpOn(); 
} 

내가, 내가 혜택이 정말 무엇인지 궁금하네요 큰 리팩토링 작업을 태클을 싫어하지 않아요 동안. Stephen Cleary와 같은 많은 사람들이 "async all way"솔루션을 주창하지만, 주 목적은 내 Task.Run() 기술이 이미 수행하는 장기 실행 BLL 프로세스를 호출 할 때 UI를 응답 성있게 유지하는 것입니다.

+2

"async all way"는 "비동기 코드를 차단하지 마십시오"라고 말하는 또 다른 방법입니다. 이것은 한 방향으로 만 진행됩니다.UI 애플리케이션의 경우, 비동기의 가장 큰 장점은 응답 성입니다.'Task.Run 대기 '는 완벽하게 훌륭한 솔루션입니다. –

답변

7

귀하의 앱 (아마도)은 부하가 높지 않고 GUI 응용 프로그램이므로 async를 사용하는 유일한 이유는 생산성 향상입니다. 처리량 및 확장 성은 사진을 입력하지 않습니다.

따라서 가장 편리한 방법을 사용하십시오. 이것은 샘플 코드에서 사용한 패턴 await Task.Run이 될 수 있습니다.

하지만이 시스템

예에 걸쳐 영향을 줄 것입니다. 비동기는 생산성 비용이 눈에 띄며 전염성이 있습니다. 그 선택에서 얻을 수있는 혜택을 명확하게 표현할 수 있다면 그렇게하십시오. 여기에서 유일한 이점은 UI 코드가 몇 자 짧은 것입니다. 그것은 두 개의 코드 스 니펫의 차이점입니다. 나머지 시스템 전체가 악화됩니다.

어쩌면 C# 커뮤니티를 팔로우하고 비동기가 계속 진행되는 추세를 찾아 냈을 것입니다. 프로그래머는 이해하지 못하면서 마술 솔루션으로 쉽게 넘어 가기 쉽습니다. 비동기를 주장하는 많은 사람들은 자신이 파생 된 구체적인 이점을 분명하게 표현할 수 없습니다. 많은 그룹이 생각합니다. 혼자 인터넷 조언에 대한 결정을 내리지 마십시오. in을 확인하고 무엇이 의미가 있는지 확인하십시오.

+0

이제는 데스크톱 애플리케이션 일 뿐이지 만 SignalR을 사용하여 특정 BLL 메소드를 노출 할 계획이 있습니다 (예 : 스마트 폰 클라이언트가 H/W 장치에 대한 제한된 제어 기능을 제공합니다 (단 하나 또는 두 개의 클라이언트가 아닙니다). 필자는 SignalR이 클라이언트 연결을 비동기 적으로 처리한다는 것을 이해하고 있으며, 아마도 비동기 전체에서 여전히 충분한 이유가 될 수있을 것입니다. –

+0

SignalR은 작업을 반환하는 것을 지원합니다. 그 작업은'Task.FromResult' 또는 "더미"작업을 만드는 다른 방법 일 수 있습니다. 부하가 없으면 perf 문제가 없습니다. SignalR은 내부적으로 효율적인 소켓 IO를 사용할 것이므로 이점을 누릴 수 있습니다. – usr

관련 문제