2016-12-09 1 views
4

지금 시작하지 않고 비동기 작업을 만들고 싶습니다. 내 함수에 반환 값을 추가 예외를 처리하는 그러나입력 된 비동기 작업 만들기

private Task CreateTask() { 
     return new Task(
      async() => await DoSomething().ConfigureAwait(false)); 
    } 

: 유형이 지정되지 않은 작업으로 아무 문제가 없다. 하지만 올바른 구문으로 어떻게 쓸 수 있습니까?

private Task<bool> CreateTask() { 
     return new Task<bool>(
      async() => await DoSomething().ConfigureAwait(false)); 
    } 

비동기식 람다 식은 func로 변환 할 수 없다는 메시지가 나타납니다. 그럼 내 질문 : 올바르게 쓰여졌습니까?

+1

두 가지 방법이 잘못. 'DoSomething()'은 이미 실행중인 Task를 반환하기 때문에 그대로 리턴 할 수 있습니다.'return (Task) DoSomething();'. 'await' *는 이미 실행중인 작업이 완료 될 때까지 기다리고 *, 비동기 적으로 시작하지는 않습니다. 'new'로 콜드 태스크를 생성 할 이유는 없습니다. 두 번째 경우에는 가치가 무엇입니까? –

+1

[XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)의 경우와 같습니다. X에 문제가 있습니다. Y가 해결책이라고 생각하고 작동하지 않을 때 Y에 대해 물어보십시오. 해결할 실제 문제는 무엇입니까? –

+0

동기 처리 메소드에서와 같이 예외 처리는'await'호출을 예외 처리기로 둘러 쌉니다. 'await'은 원 래 예외가 던져지게합니다. try {.... await CallMyServer();} catch (WebException exc)와 마찬가지로 try {.... await CallMyServerAsync();} catch (WebException exc) {...}) {{}}'CallMyServer'가 블로킹 메소드 인 경우 –

답변

3

지금 시작하지 않고 비동기 작업을 만들고 싶습니다.

해결하려는 모든 문제에 대한 잘못된 해결책입니다. 당신이 미래에 실행할 코드를 정의하려면, 당신은 대리인 사용해야

private Func<Task> CreateTaskFactory() 
{ 
    return async() => await DoSomething().ConfigureAwait(false); 
} 

을하지만 내 함수에 반환 값을 추가 예외를 처리 할 수 ​​있습니다.

또 다른 해결책은 최선의 방법이 아닙니다. 태스크는 이미 추가 코드를 작성하지 않고 예외를 잘 이해합니다. 당신이 값을 반환 할 필요성을 경우

(데이터로), 당신은 Task<T>를 생성하는 대리자를 반환 할 수 있습니다

private Func<Task<int>> CreateTaskFactory() 
{ 
    return async() => await DoSomethingReturningInt().ConfigureAwait(false); 
} 
+0

'CreateTaskFactory'는'return DoSomething(); '일 수 있습니다. 여기'async' 델리게이트에는 이점이 없습니다. – Servy

+0

@Servy : 저는 작전이 지금 작전을 정의하고 싶지만 나중에 시작하기를 원합니다. –

+0

죄송합니다.'return() => DoSomething(); ' – Servy