C # 및 TPL ( Task Parallel Library )에서 Task
클래스는 T 유형의 값을 생성하는 진행중인 작업을 나타냅니다.
Task.FromResult 메서드에 무엇이 필요한지 알고 싶습니다 .
즉, 이미 생산 된 가치를 가지고있는 시나리오에서이를 다시 작업으로 랩핑해야합니까?
염두에 두어야 할 것은 Task 인스턴스를 허용하는 다른 메소드의 일부 어댑터로 사용된다는 것입니다.
답변
내가 찾은 두 가지 일반적인 사용 사례가 있습니다.
- 비동기 호출자를 허용하는 인터페이스를 구현하지만 구현이 동기식 인 경우
- 테스트를 위해 비동기 코드를 스터 빙 / 모의 할 때.
답변
한 가지 예는 캐시를 사용하는 방법입니다. 결과가 이미 계산 된 경우 값을 사용하여 완료된 작업을 반환 할 수 있습니다 (Task.FromResult
)을 . 그렇지 않은 경우 계속 진행중인 작업을 나타내는 작업을 반환합니다.
캐시 예 : 미리 계산 된 값에 Task.FromResult를 사용하는 캐시 예
답변
async 키워드를 사용하지 않고 대기 가능한 메소드를 작성하려는 경우 사용하십시오. 이 예제를 찾았습니다.
public class TextResult : IHttpActionResult
{
string _value;
HttpRequestMessage _request;
public TextResult(string value, HttpRequestMessage request)
{
_value = value;
_request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage()
{
Content = new StringContent(_value),
RequestMessage = _request
};
return Task.FromResult(response);
}
}
여기에서는 웹 API 작업에 사용되는 IHttpActionResult 인터페이스의 자체 구현을 만듭니다. ExecuteAsync 메서드는 비동기식이어야하지만 비동기 키워드를 사용하여 비동기식 및 대기 가능하게 만들 필요는 없습니다. 이미 결과가 있고 기다릴 필요가 없으므로 Task.FromResult를 사용하는 것이 좋습니다.
답변
MSDN에서 :
이 메소드는 Task 객체를 반환하는 비동기 작업을 수행하고 해당 Task 객체의 결과가 이미 계산 된 경우에 유용합니다.
답변
비동기 작업을 원할 때 Task.FromResult를 사용하지만 때로는 결과가 동기식입니다. http://msdn.microsoft.com/en-us/library/hh228607.aspx 에서 좋은 샘플을 찾을 수 있습니다 .
답변
코드에서 다른 독립적 인 작업을 수행하는 동안 완료하는 데 시간이 오래 걸리는 동기식 메서드에 Task.FromResult를 사용할 수 있다고 주장합니다. 오히려 오히려 메서드를 비동기 호출하도록하십시오. 그러나 호출 된 코드를 제어 할 수없고 암시적인 병렬 처리를 원하는 상황을 상상해보십시오.