이 코드를 반환하는 작업 또는 작업<object>?
-
21-12-2019 - |
문제
내가 읽기 해당, 게시물에 의해 스티븐 Toub.
public static Task RunAsync(Action action)
{
var tcs = new TaskCompletionSource<Object>();
ThreadPool.QueueUserWorkItem(_ =>
{
try
{
action();
tcs.SetResult(null);
}
catch(Exception exc) { tcs.SetException(exc); }
});
return tcs.Task;
}
때문에 우리는 더 이상 무슨 상관의 유형
T
입니다,나는 기본값으로 사용하기Object
.그런 다음 경우Action
이 성공적으로 실행,SetResult
여전히 사용하는 전환Task
로RanToCompletion
최종 상태그러나,이후 실제 결과 값이 없다.null
사용됩니다. 마지막으로,RunAsync
환Task
보Task<Object>
.물론,인스턴스화task
'들은 여전히 유형Task<Object>
, 지만,우리에게 필요하지 않으로 그것을 참조 하십시오,그리고 소비자 이 방법의 필요에 대한 관심이 없는 그 구현세요.
나가지 못하는 이유를 이해하는 방법을 반환해야 합니다 Task
보 Task<object>
(는 이유는 내가 강조되고 굵은 문장).나는 방법은 설정을 돌아 Task
지 tcs
가 TaskCompletionSource<Object>
, 지 TaskCompletionSource
(는 잘못이 나는 생각한다).
해결책
가 없는 일반적인 비 TaskCompletionSource
고 고려하고 당신이 원하는 모든 작업,그 결과 결과는 중요하지 않습니다.발신자가 알지 못하고 걱정하지 않는 이 경우에는 작업이 실제로 Task<object>
, 자만 await
s 고,얻으면 예외가 하나입니다.발신자의 인식이 실제 결과입니다.
이는 사실에 의해 촉진 Task<T>
에서 상속 Task
그것은 또한 일반적인을 찾을 수 Task<bool>
는 false 를 반환하거나, Task<int>
0.
다른 팁
이 없 아닌 일반 TaskCompletionSource
클래스의 인스턴스를 만들기 위한 Task
하지 않는 인스턴스 Task<T>
.이 두 가지 옵션에 대한 일반적인 유형을 위한 매개변수 TaskCompletionSource<T>
할 때 걱정하지 않는다(거나 제공하지 않)반환 값:
- 사용하는 임의의 기존 등과 같은 형식
object
, 으로 돌아 유형입니다.값을 설정null
을 나타내는 작업을 완료. - 사용 특정 비공개 형식 및 값을 설정
null
을 나타내는 작업을 완료.
를 만들 때 TaskCompletionSource<T>
인스턴스의 목적에 대한 제공 Task
는 반환 값이 없는,내가 선호하는 사용 전용 비 공용 유형을 보장하이 걸리는 코드는 실수하지 않을 것이다 돌아 Task
으로 인스턴스 Task<T>
치 결과는 의미가 있다.
첫째,정의는 다음과 같은 클래스(수 private sealed class
는 경우 그것은 중첩된 내에서 또 다른 유형):
internal sealed class VoidResult
{
}
그런 다음 대신 사용 TaskCompletionSource<object>
이 완료 원본,사용 TaskCompletionSource<VoidResult>
.이후 VoidResult
입력하지 않은 액세스 코드를 호출하여,사용자가할 수 없습니다 캐스팅 Task
객체를 인스턴스 Task<VoidResult>
.
나가지 못하는 이유를 이해하는 방법을 반환해야 합니다
Task
보Task<object>
기 때문에 당신이 돌아 Task<Object>
그것이 의미하는 경우 이 메소드가 완료되면 생산됩니다 몇 가지 유용한 유형의 값 Object
.이 경우에는 우리가 생성하지 않는 모든 결과,그 이유는 스테판을 선택하 return Task
.
면 우리가 해결해야 할 문제 Func<Object>
그때로 돌아 Task<Object>
적절할 것으로 Func
생산됩니다 어떤 결과,우리는 반환하도록 선택할 수 있습니다.
유
TaskCompletionSource<Object>
, 지TaskCompletionSource
?
이 없기 때문에 그런 것입니다.이 없 아닌 일반 TaskCompletionSource
.
당신이 돌아 Task<object>
, 다음 var result = await RunAsync(...)
항상 돌아 null
, 이후,그것은 당신이 무슨 설정한 결과다.
클라이언트에 대해 상관 없이,그래서 당신은 단지 반환 Task
.
이상적으로,당신은 당신을 사용하는 것 TaskCompletionSource
내부적으로 대 TaskCompletionSource<object>
, 고,그냥 통화 같은 뭔가 SetCompleted()
대 SetResult(null)
.그러나 이러한 형식이 존재하지 않습니다.