4

비동기 개념을 파악하고 산발적으로 사용했지만 모범 사례와 관련하여 몇 가지 질문이 있습니다.

  1. while (condition) 루프에서 await을 사용하여 while 조건이 변경 될 때까지 존재할 수있는 데이터를 계속 가져올 수 있습니까? stopProcessingMessages = false.

  2. winforms와 같은 응용 프로그램에서 UI가 스레드에서 실행되는 동안 버튼 클릭과 같은 작업에서 async / await를 사용하면 상당히 간단합니다. 그러나 전체 콘솔 응용 프로그램이나 심지어 Windows에서 비동기 적으로 적용하려는 경우에는 어떻습니까? 서비스. 처음에 그 첫 번째 작업을 기다리는 가장 좋은 방법은 Task.Run (() => ...)일까요?

나는 제 2의 질문에서 제가 의미를 갖기를 바랍니다. 비동기를 최대한 활용하여 최대한 활용하고 싶지만 초기 비동기 작업을 시작하여 다른 모든 비동기 함수로 버블 링하는 방법을 이해하기 만하면됩니다.

적절한 코드 블록을 사용하지 않는 것에 대해 사과드립니다. 스마트 폰을 사용하는 기차에 있습니다.

3 답변


7

비동기 개념을 파악하고 산발적으로 사용했지만 모범 사례와 관련하여 몇 가지 질문이 있습니다.

나는소개async/await블로그 게시물대부분의 소개보다 더 자세히 설명하고 몇 가지 모범 사례를 소개합니다.

while (condition) 루프에서 await을 사용하여 while 조건이 변경 될 때까지 존재할 수있는 데이터를 계속 가져올 수 있습니까? stopProcessingMessages = false.

당신은 긴밀한 루프를 피하기를 원합니다. 그래서while (condition) GetDataIfPresent();CPU를 많이 소비 할 것입니다.

또는,async반환 된 메서드null(또는 무엇이든) ifstopProcessingMessages~이다.true. 이 경우 코드가while (true), 그리고 더 TAP과 같은 해결책은 사용하는 것입니다.CancellationSource깃발 대신에.

또한보십시오TPL 데이터 흐름; 그것은 당신의 상황에 유용 할 것 같은데.

콘솔 응용 프로그램 또는 심지어 windows 서비스. 첫 번째로 킥오프하는 가장 좋은 방법은 무엇입니까?

콘솔 앱의 경우Wait최상위 레벨 태스크에서. 이것은 일반적인 가이드 라인에 대한 허용되는 예외입니다 (이는await대신에Wait).Waiting은 콘솔 앱 기간 동안 스레드를 구울 것입니다.하지만 대개는 더 복잡한 솔루션을 보증 할 정도로 중요하지 않습니다. 콘솔 앱용 단일 스레드 컨텍스트를 설치하려면 다음을 사용할 수 있습니다.AsyncContext.RunAsyncEx 라이브러리.

Win32 서비스의 경우 일반적으로너 자신의 실을 시작할 필요가있다.. 당신이 사용할 수있는Task.Run이 경우 (다중 스레드 컨텍스트가 필요한 경우) 또는AsyncContextThreadAsyncEx (단일 스레드 컨텍스트가 필요한 경우).


  • 간결한 대답 스티븐에 감사드립니다. 실제로 TPL Dataflow의 BufferBlock으로 끝났습니다. 콘솔 환경에서 Task.Run (async () = & gt; await ....); 초기 비동기 프로세스를 시작하는 것만으로도 충분할 것입니다. - Sash
  • 콘솔 최상위 레벨로 돌아 가기async동작:Task.Run단순히 전화를 걸면 무엇이든 얻지 못할 것입니다.async방법. 너는 여전히 필요하다.Wait반환 된 작업이 끝나기 전에 완료 될 때까지 기다립니다. - Stephen Cleary

2

좋은 아침,

오히려 async / await 패턴보다 첫 번째 시나리오에서 'LongRunning'으로 설정된 TaskCreationOption이있는 일반 작업을 사용하고 싶습니다. 이렇게하면 블록 전체가 하나의 장기 실행 작업으로 실행됩니다. while 루프를 사용하면서 각 루프마다 새로운 작업을 시작할 수는 있지만, 최적 일 수는 없습니다. ;-)

두 번째 질문에 대해서는 미안하지만 당신의 요점은 모르겠다.

희망이 도움이됩니다.


  • 사실,await실제로 시작될 것입니다 ... 얼마나 많은 새로운 작업이 있습니까? 그렇지 않으면stopProcessingMessages변수가 급하게 설정되면 수천 개의 스레드를 회전시킬 수 있습니다. 즉, & quot; 계속 가져 오기 & quot; 심지어 질문의 맥락에서 의미합니까? 단일 작업에는하나결과, 연속적으로 가져올 데이터 스트림이 아닙니다. - Snixtor

0

존재할 수있는 데이터를 유지하기 위해 루프를 사용하는 것은 좋지 않습니다. 완료시 자동으로 콜백 메소드를 호출하는 비동기 호출을 작성할 수 있습니다.이 경우 "대기 중"단계는이 대기 단계를 사용중인 OS에 최적의 방식으로 처리하는 OS 메커니즘에서 발생합니다.

주제에 대한 더 깊은 연구를 위해 여기를보십시오 :http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

연결된 질문


관련된 질문

최근 질문