2013-06-02 3 views
1

나는 asynchrounously 실행하려는 간단한 코드를 가지고 : 나는 await Task.Delay(1000);을 추가 할 때C#을 비동기, 기다리고

private async void Encryption() 
{ 
    ShowBusyIndicator(); 

    await encryptor.EncryptAsync(); 

    HideBusyIndicator(); 
} 

요점은, : 나는 방법 위의 호출 방법은

public async Task EncryptAsync() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     // shift bytes 
     // column multiplication 
     // and so on 
    } 
} 

이 방법에서는 busi 표시기가 표시되지만 1 초 후에 응용 프로그램이 잠기고 암호화 완료를 위해 SYNCHRONOUSLY를 기다립니다. Task.Delay를 제거하면 응용 프로그램이 잠기고 작업이 끝난 후 잠금이 해제됩니다.

내 경우에 await과 asyc를 올바르게 사용하는 방법은 무엇입니까? 간단히 메서드 encryptor.EncryptAsync()을 비동기 적으로 실행하기를 원합니다.

+0

코드에서 제공하는 컴파일러 경고에 유의하십시오. – SLaks

+3

암호화는 ** 어렵습니다 **. 자신의 암호화를 발명하지 마십시오. – SLaks

+0

그것은 반짝 반짝 빛나는보고를위한 기능입니다 : P – Fka

답변

4

async/await 키워드를 사용하면 이 (가) 허용되지 않습니다. 비동기식을 새로 만듭니다. 대신 기존 비동기 작업이 완료 될 때까지 기다릴 수 있습니다.

UI를 차단하지 않도록 백그라운드 스레드에서 CPU 바인딩 작업을 실행하려고합니다.
이렇게하려면 Task.Run()에 전달 된 람다 내부의 동기 차단 메서드를 호출하십시오.

그러면 await을 사용하여 결과 비동기 작업 (Task 인스턴스)을 기다릴 수 있습니다.

+0

더 자세히 설명해 주시겠습니까? – Fka

+0

http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx는 매우 기본적인 기사이며 int를 반환하는 작업으로 비동기 대기를 포함하는 좋은 샘플입니다. – ilansch

+0

쓴 : 비공개 비동기 무효 암호화() { ShowBusyIndicator(); 기다리는 중 Task.Run (() => encryptor.EncryptAsync()); HideBusyIndicator(); } 작동! – Fka

관련 문제