2012-09-22 6 views
-1

최근 비동기 프로그래밍을위한 async/await 키워드 인 새로운 C# 기능에 대해 배우려고합니다.비동기 프로그래밍 C#

static void Main(string[] args) 
    { 
     Console.WriteLine("Task based APM demo"); 

     // Call Exponnent() asynchronously. 
     // And immediately return the control flow. 
     // If I don't put a Task here, the program will sometimes 
     // terminate immediately. 
     Task t = new Task(async() => 
     { 
      int result = await Program.Exponent(10); 

      // After the operation is completed, the control flow will go here. 
      Console.WriteLine(result); 
     }); 

     t.Start(); 
     Console.ReadKey(); 
    } 

    static async Task<int> Exponent(int n) 
    { 
     Console.WriteLine("Task started"); 
     return await TaskEx.Run<int>(() => 2 << (n - 1)); 
    } 
} 

내가 그것에 대해이 문이 행동하는 방식에 대한 질문이 : 내가 웹에서 검색 할 때, 나는이 예제를 직면했다. 처음에는 그 시점에서 프로세스를 해제하고 호출자 컨텍스트로 돌아 가기를 원할 때 기다리는 표현식을 이해합니다. 그러나이 표현식이 Exponent 메소드가 호출 한 라인에서 이것을 사용하는 이유는 무엇입니까? 실제로 컴파일러가이 프로그램 라인에 직면했을 때 어떤 일이 발생 했습니까? 편지 질문은, 왜 프로그램이 지수 메서드 본문에서 결과를 반환하기 위해 "TaskEx.Run"을 사용합니까? "return await (() => 2 < < (n - 1))을 사용할 수 있습니까?" 만? 이 줄로 컴파일러가 어떻게 동작합니까? 사전

+0

이 질문에 좀 더 구체적인 제목이 있어야한다고 생각하지만, 어떻게해야하는지 잘 모르겠습니다. 누구나 아이디어가 있습니까? – svick

+0

@Azad : 'async'에 대한 소개 (예 : [내 블로그의 블로그] (http://nitoprograms.blogspot.com/2012/02/async-and-await.html))와 그 다음 [async/await FAQ] (http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/10293335.aspx)를 따르십시오. –

답변

1

그러나에

덕분에 왜이 표현은 지수가 그것을라는 줄이 사용?

이 질문이 의미하는 바가 확실하지 않습니다. await Task.Run<int>(() => 2 << (n - 1));은 태스크가 완료 될 때까지 현재 메소드의 실행을 일시 중단하도록 컴파일러에 지시합니다. 작업의 측면에서,이 유사합니다 물론,

Task.Run<int>(() => 2 << (n - 1)).ContinueWith(t=>return t.Result); 

, 당신은 계속에서 return 수 없습니다. async 키워드는 컴파일러에게 메서드에 하나 이상의 await 연산자가있을뿐만 아니라 비동기 작업에서 시작하여 반환되는 여러 상태 전환을 관리하는 상태 시스템을 설정한다는 것을 알려줍니다. 또한 이것은 메소드가 호출자와 비동기 관계로 실행되는 방식에 영향을 줄 수 있습니다.

Main에 사용되는 Task에 관해서는

: Main에서 당신이 할 수없는 await 메서드 호출, 그래서, 나는 Task 여전히 await 연산자를 사용하는 데 사용됩니다 가정합니다. 하지만, 그것은 중복 것으로 보인다. 나는 코드가 원래 그런 식으로 서면 또는 이유를 뒤에 이유를 모르는,

static void Main(string[] args) 
    { 
     Method(); 
     Console.ReadLine(); 
    } 

을하지만 :

다음
static async void Method() 
    { 
     Console.WriteLine(await Exponent(10)); 
    } 

Main를 다시 쓰기 : 아마 단순히 await 사용하는 다른 방법을 것 진짜 목적이 있더라도.

"return await (() => 2 < < (n - 1));

비동기가 수행되지 않으므로이 코드 줄을 쓸 수 없습니다. () => 2 << (n - 1)도 작업 개체와 관련하여 GetAwaiter 메서드가 없습니다. 그래서 비동기 적으로 실행될 수 있습니다. 그러므로, 그것은 "기다릴"수 없다.

+0

첫 번째 질문은 라인을 참조합니다 : 작업 t = 새 작업 (async() => {int result = await Program.Exponent (10);}); 메소드의 본문에 사용 된 경우 Exponent 메소드를 호출하기 위해 표현식을 기다려야하는 이유는 무엇입니까? – Azad

+0

@Azad 제 답변을 업데이트했습니다. –