2016-12-14 7 views
2

Task 형식의 인수를 여기에 제시되지 않은 일부 함수에 전달해야합니다. 함수 내부에서이 작업은 비동기 방식으로 실행됩니다. 이 세 가지 방법의 차이가이 통과 할 경우Task.Run 대 Invoke()의 차이

1.

Task.Run((Func<Task>)(async() => Foo = await OperateAsync(id))) 

2.

Task.Run(async() => Foo = await OperateAsync(id)) 

3.

((Func<Task>)(async() => Foo = await OperateAsync(id))).Invoke() 

답변

3

예.

Task.Run의 오버로드가 호출되는 1과 2가 다릅니다. 후자는 결과를 통과합니다.

1 및 2 스레드 풀에 대한 OperateAsync의 강제 실행. 3은 그렇지 않습니다. 다른 세부 사항에 따라 매우 쉽게 볼 수 있습니다. 예를 들어 데스크톱 응용 프로그램에서 OperateAsync이 UI 요소에 액세스하는 경우 Task.Run을 사용하여 호출하면 안됩니다.

+0

성능 측면에서 두 번째 접근 방식이 더 낫습니다. – AsValeO

+1

@AsValeO 동일해야합니다. 둘 중 어느 것이 더 빠를 경우 다른쪽에 기회가 없어 졌다고 생각합니다. 위임자 구성으로 인해 요청하는 경우 두 번째 인스턴스에도 암시 적으로 발생한다는 점을 명심하십시오. – hvd