2012-05-22 2 views
4

이 오류는 컴파일 오류를 발생시키지 않지만 그 이유는 무엇입니까? 행동에 반대C# .net 4.5 async delegate

public async void DoSomething(object arg){ ... } 

Action<object> myAnonActionDelegate = DoSomething; 

는 "DoSomething는"유형 Func<object,Task>의 서명을하지 말았어야? 사실 "DoSomething"은 Func<object,Task> 대리인에게 할당 할 수 없습니다.

질문은 이유가 무엇입니까? 비동기 키워드 해제에 대한 나의 이해가 있습니까?

답변

6

"DoSomething"의 서명이 동작이 아닌 Func<object,Task>이어야합니까?

아니요 -이 메서드는 아무 것도 반환하지 않습니다. 선언문을 보자.이 아니라 void이다. async 부분은 컴파일러의 이익 (그리고 사람이 읽는 것)을위한 부분 일뿐입니다. 실제로 메소드의 서명 부분이 아닙니다. 비동기 메서드는 void, Task 또는 Task<T> 중 하나를 반환해야하지만 실제로는 의 반환 유형은입니다. 컴파일러는 voidTask으로 마술처럼 바꾸지 않습니다.

이제 동일한 방법 본문을 작성하고 같은 방법을 선언 할 수 :

public async Task DoSomething(object arg){ ... } 

하는 당신이 필요가 사용하는 것이 포인트 Func<object, Task> -하지만 다른 방법 선언입니다.

난 강력하게 Task 하지 않는 한 이벤트에 가입 비동기 방식을 사용하고 반환하는 형태로 사용을 권합니다

- 당신은뿐만 아니라 발신자가 당신의 방법의 진행 상황을 관찰 할 수 있습니다를, 실패 등

+0

없음 그것은 IAsynchResult 또는 Task를 반환해야합니다. 어떤 것이지 모르지만이 메서드가 비동기 메서드임을 나타내는 무언가로 컴파일해야합니다. – Alwyn

+0

알았습니다. 고마워. 존. 내 생각에 비동기가 자동으로 작업 내에서 반환 형식을 래핑 할 것이라고 생각하고 있다고 생각합니다. – Alwyn

+1

@Alwyn,'async' 메소드는'IAsyncResult'를 리턴 할 수 없습니다. 항상'void','Task' 또는'Task '을 리턴해야합니다. – svick