C #에서 Task.FromResult <TResult> 사용은 무엇입니까 Parallel Library )에서

C # 및 TPL ( Task Parallel Library )에서 Task클래스는 T 유형의 값을 생성하는 진행중인 작업을 나타냅니다.

Task.FromResult 메서드에 무엇이 필요한지 알고 싶습니다 .

즉, 이미 생산 된 가치를 가지고있는 시나리오에서이를 다시 작업으로 랩핑해야합니까?

염두에 두어야 할 것은 Task 인스턴스를 허용하는 다른 메소드의 일부 어댑터로 사용된다는 것입니다.



답변

내가 찾은 두 가지 일반적인 사용 사례가 있습니다.

  1. 비동기 호출자를 허용하는 인터페이스를 구현하지만 구현이 동기식 인 경우
  2. 테스트를 위해 비동기 코드를 스터 빙 / 모의 할 때.

답변

한 가지 예는 캐시를 사용하는 방법입니다. 결과가 이미 계산 된 경우 값을 사용하여 완료된 작업을 반환 할 수 있습니다 (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 객체의 결과가 이미 계산 된 경우에 유용합니다.

http://msdn.microsoft.com/en-us/library/hh228607.aspx


답변

비동기 작업을 원할 때 Task.FromResult를 사용하지만 때로는 결과가 동기식입니다. http://msdn.microsoft.com/en-us/library/hh228607.aspx 에서 좋은 샘플을 찾을 수 있습니다 .


답변

코드에서 다른 독립적 인 작업을 수행하는 동안 완료하는 데 시간이 오래 걸리는 동기식 메서드에 Task.FromResult를 사용할 수 있다고 주장합니다. 오히려 오히려 메서드를 비동기 호출하도록하십시오. 그러나 호출 된 코드를 제어 할 수없고 암시적인 병렬 처리를 원하는 상황을 상상해보십시오.