작업의 용도는 무엇입니까?C# 의 결과로부터
C# 및 TPL(Task Parallel Library)에서,Task
클래스는 T형 값을 생성하는 진행 중인 작업을 나타냅니다.
작업의 필요성이 무엇인지 알고 싶습니다.결과 방법에서?
즉, 다음과 같습니다.생산된 가치를 이미 눈앞에 둔 시나리오에서 이를 다시 작업으로 포장할 필요성은 무엇입니까?
작업 인스턴스를 수락하는 다른 메서드에 대한 어댑터로 사용된다는 것만 생각할 수 있습니다.
두 가지 일반적인 사용 사례가 있습니다.
- 비동기 호출자를 허용하는 인터페이스를 구현하지만 구현이 동기화되는 경우.
- 테스트를 위해 비동기 코드를 스텁/모킹하는 경우.
한 가지 예로 캐시를 사용하는 방법을 들 수 있습니다.결과가 이미 계산된 경우 값을 사용하여 완료된 작업을 반환할 수 있습니다(사용).Task.FromResult
그렇지 않은 경우 계속 진행 중인 작업을 나타내는 작업을 반환합니다.
캐시 예제: 태스크를 사용한 캐시 예제.사전 계산된 값의 결과로부터
비동기 키워드를 사용하지 않고 대기 중인 메서드를 만들 때 사용합니다.다음과 같은 예를 찾았습니다.
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 메서드는 비동기식으로 예상되지만 비동기식으로 대기할 수 있도록 하기 위해 async 키워드를 사용할 필요는 없습니다.이미 결과를 얻었기 때문에 기다릴 필요가 없으므로 작업을 사용하는 것이 좋습니다.결과에서.
msft.com 에서 다음을 사용하여 사전 예약 작업 생성Task.FromResult
:
이 방법은 작업 개체를 반환하는 비동기 작업을 수행하고 해당 작업 개체의 결과가 이미 계산된 경우에 유용합니다.
작업을 사용합니다.결과에서 비동기 작업을 수행하려고 하지만 결과가 동기화되어 있는 경우가 있습니다.http://msdn.microsoft.com/en-us/library/hh228607.aspx 에서 좋은 샘플을 찾을 수 있습니다.
저는 당신이 작업을 사용할 수 있다고 생각합니다.FromResult는 코드에서 다른 독립적인 작업을 수행할 수 있는 동안 완료하는 데 시간이 오래 걸리는 동기식 메서드에 대한 결과입니다.저는 오히려 비동기를 호출하기 위해 그러한 방법을 만듭니다.하지만 호출된 코드를 제어할 수 없고 암묵적인 병렬 처리를 원하는 상황을 상상해 보십시오.
Task.Run()은 람다 스레드를 만들고 비동기식이 필요하지 않으며 형식 개체를 반환합니다.이 예에서는 여러 작업이 동시에 실행되어 완료되기를 기다리고 있습니다.모든 작업이 완료되면 결과를 순환할 수 있습니다.Task.FromResult는 Task에 의해 생성되지 않은 작업 결과를 푸시하는 데 사용됩니다.실행()
작업.FromResult 이 경우 Result 클래스의 RecordStruct 클래스에서 형식 개체를 푸시합니다.getData 함수를 호출하는 작업을 만들었습니다.작업.WaitAll은 각 작업을 처리하고 결과를 RecordStruct 유형의 결과 개체 배열로 밀어넣습니다.그런 다음 결과로 RecordStruct 클래스의 속성 요소에 액세스합니다.
public class RecordStruct
{
public RecordStruct(string _element) {
element = _element;
}
public string element { get;set; }
}
public class TaskCustom
{
public Task<RecordStruct> getData(string phrase)
{
if (phrase == "hello boise")
{
return Task.FromResult(new RecordStruct("Boise is a great place to live"));
}
return Task.Run(() =>
{
return new RecordStruct(phrase);
});
}
}
[Fact]
public async Task TestFactory()
{
TaskCustom obj = new TaskCustom();
List<Task<RecordStruct>> tasks = new List<Task<RecordStruct>>();
tasks.Add(obj.getData("hello world"));
tasks.Add(obj.getData("hello boise"));
Task.WaitAll(tasks.ToArray());
for(int ctr = 0; ctr < tasks.Count; ctr++) {
if (tasks[ctr].Status == TaskStatus.Faulted)
output.WriteLine(" Task fault occurred");
else
{
output.WriteLine("test sent {0}",
tasks[ctr].Result.element);
Assert.True(true);
}
}
}
언급URL : https://stackoverflow.com/questions/19568280/what-is-the-use-for-task-fromresulttresult-in-c-sharp
'programing' 카테고리의 다른 글
일치하는 항목을 찾을 수 없는 Mongoose 쿼리에서 반환되는 항목은 무엇입니까? (0) | 2023.05.11 |
---|---|
날짜 시간 x 시리즈에 대한 탁월한 그림 (0) | 2023.05.11 |
특정 명령에 대한 Bash 무시 오류 (0) | 2023.05.11 |
NameError: 글로벌 이름 'unicode'가 정의되지 않았습니다(Python 3). (0) | 2023.05.11 |
제약 조건이 0의 높이를 모호하게 제시하는 경우를 감지함 (0) | 2023.05.11 |