나는 그것들이 기본적으로 같은 것이라고 생각했습니다. 프로세서 (2+ 프로세서를 가진 머신에서) 사이에 작업을 나누는 프로그램을 작성하는 것입니다. 그리고 내가 읽고 있어요 이 , 어떤 말한다 :
비동기 메서드는 비 차단 작업입니다. 비동기 메서드의 대기 식은 대기중인 작업이 실행되는 동안 현재 스레드를 차단하지 않습니다. 대신, 표현식은 나머지 메소드를 연속으로 등록하고 비동기 메소드의 호출자에게 제어를 리턴합니다.
async 및 await 키워드는 추가 스레드를 생성하지 않습니다. 비동기 메서드는 자체 스레드에서 실행되지 않으므로 비동기 메서드에는 멀티 스레딩이 필요하지 않습니다. 메소드는 현재 동기화 컨텍스트에서 실행되며 메소드가 활성화 된 경우에만 스레드에서 시간을 사용합니다. Task.Run을 사용하여 CPU 바운드 작업을 백그라운드 스레드로 이동할 수 있지만 백그라운드 스레드는 결과를 사용할 수있을 때까지 기다리는 프로세스에는 도움이되지 않습니다.
누군가 나를 위해 영어로 번역 할 수 있는지 궁금합니다. 비동기 성 (단어입니까?)과 스레딩을 구별하는 것으로 보이며 비동기 작업은 있지만 멀티 스레딩은없는 프로그램을 가질 수 있음을 의미합니다.
이제 나는 pg의 예제와 같은 비동기 작업의 아이디어를 이해합니다. Jon Skeet의 C # In Depth, 3 판 467
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
async
키워드 수단 " 이 기능은,이 호출 될 때마다, 그 호출이 호출 할 후에 완성이 모든 것을 요구되는 컨텍스트에서 호출되지 않습니다."
다른 말로, 일부 작업 중간에 작성
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
이후 DisplayWebsiteLength()
로는 아무 상관이없는 x
이상을 y
일으킬 것 DisplayWebsiteLength()
같은, "백그라운드에서"실행되는
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
분명히 그것은 어리석은 예이지만, 나는 정확하거나 완전히 혼란 스럽거나 무엇입니까?
(또한, 나는 이유에 대해 혼란스러워하고있어 sender
그리고 e
이제까지 위의 함수의 본문에 사용되지 않습니다.)
sender
그리고 e
이것이 실제로 이벤트 처리기라고 제안 하고 있습니다. 거의 유일한 곳 async void
이 바람직한 곳 입니다. 대부분 버튼 클릭 또는 이와 유사한 방식으로 호출됩니다. 결과적으로이 작업은 나머지 응용 프로그램과 관련하여 완전히 비동기 적으로 발생합니다. 그러나 여전히 UI 스레드 (UI 스레드에 콜백을 게시하는 IOCP 스레드에서 약간의 시간이 소요됨) 인 하나의 스레드에 있습니다.
DisplayWebsiteLength
코드 샘플 에 대한 매우 중요한 참고 사항 : 명령문 HttpClient
에서 사용하지 않아야 using
합니다.-로드가 과중하면 코드에서 사용 가능한 소켓 수를 소진하여 SocketException 오류가 발생할 수 있습니다. 부적절한 인스턴스화 에 대한 추가 정보 .