C # 및 TPL ( Task Parallel Library )에서 Task
클래스는 T 유형의 값을 생성하는 진행중인 작업을 나타냅니다.
Task.FromResult 메서드에 무엇이 필요한지 알고 싶습니다 .
즉, 이미 생산 된 가치를 가지고있는 시나리오에서이를 다시 작업으로 랩핑해야합니까?
염두에 두어야 할 것은 Task 인스턴스를 허용하는 다른 메소드의 일부 어댑터로 사용된다는 것입니다.
C # 및 TPL ( Task Parallel Library )에서 Task
클래스는 T 유형의 값을 생성하는 진행중인 작업을 나타냅니다.
Task.FromResult 메서드에 무엇이 필요한지 알고 싶습니다 .
즉, 이미 생산 된 가치를 가지고있는 시나리오에서이를 다시 작업으로 랩핑해야합니까?
염두에 두어야 할 것은 Task 인스턴스를 허용하는 다른 메소드의 일부 어댑터로 사용된다는 것입니다.
답변:
내가 찾은 두 가지 일반적인 사용 사례가 있습니다.
Task.FromResult
와 네트워크 I / O를 위해 비동기 적으로 대기하는 클라이언트가 있을 수 있습니다 . 이 방법으로을 사용하여 클라이언트 / 서버간에 동일한 인터페이스를 공유 할 수 있습니다 ChannelFactory
.
IEnumerable<T>
에서 파생 IDisposable
- 그것은 수 있습니다 열거 가능한 일회용 자원하지 않은하는 힘 이에 있습니다. 어느 쪽도 FromResult
, async
,도 await
스레드를 생성하지 않습니다.
Task
반환 방법은 " 비동기적일 수 있음"을 의미한다 . 따라서 일부 구현에는 동기식 (예 : NetworkStream
비동기식이지만 동기식 이어야 함)을 충분히 알고있는 메소드에 비동기 서명이 제공되는 경우 가 있습니다 MemoryStream
.
한 가지 예는 캐시를 사용하는 방법입니다. 결과가 이미 계산 된 경우 값을 사용하여 완료된 작업을 반환 할 수 있습니다 (Task.FromResult
)을 . 그렇지 않은 경우 계속 진행중인 작업을 나타내는 작업을 반환합니다.
Task.FromResult
캐시 할 수 있습니다.
Task.FromResult(0)
.Task.FromResult(1)
, Task.FromResult(false)
및 Task.FromResult(true)
캐시됩니다. 네트워크 액세스를 위해 작업을 캐시하지 않아도되지만 결과적으로 완벽하게 처리됩니다. 값을 반환해야 할 때마다 하나씩 생성 하시겠습니까?
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
이전에 캐시 된 비동기 결과를 얻는 데 사용됩니다.