2013-08-02 6 views
0

나는 asyncawait이라는 개념이 새로 도입되었습니다. 지금 나는 이런 식으로 뭔가있어 : 비동기 메서드의 일부를 람다로 리팩토링

public async void DoSomething() 
{ 
    using (var obj = new SomeClass()) 
    { 
     await obj.SomeAction(); 
    } 

    Done = true; 
} 

그러나 obj 개체의 생성 및 관리와 같은

더 복잡해지고, 나는 이런 식으로 리팩토링 싶습니다 :

public async void DoSomething() 
{ 
    Manager.Execute(obj => 
    { 
     await obj.SomeAction(); 
    }); 

    Done = true; 
} 

그러나 위의 코드는 컴파일되지 않습니다. 그것은 여기에 또는 거기에 async 또는 await 키워드가 반드시 부족합니다. 나는 또한 Execute() 방법을 쓰는 방법을 모른다. 도울 수 있니?

+1

당신은'async void'를 피해야합니다. 호출자가 완료 시점을 알 수 없으며, 예외 처리 의미가 어렵거나, 단위 테스트 등에 사용할 수 없습니다. –

답변

1

첫째, 람다에서 await를 사용하여, 당신은 단지 방법처럼 async 수정로 장식해야 :

Func<Task<Foo>> asyncFooFactory = async() => await whatever; 

그리고 다음과 같이 것 Execute 방법 :

// instead of Task, you could use void, but then you can't await its completion, 
// which could get handy later, depending on your use case 
public static async Task Execute(Func<YourClass, Task> externalStuff) 
{ 
    using (var obj = new YourClass()) // replace with your own initializer code 
    { 
     await externalStuff(obj); 
    } 
} 
관련 문제