programing

작업의 용도는 무엇입니까?C#의 결과로부터

goodsources 2023. 5. 11. 21:24
반응형

작업의 용도는 무엇입니까?C#의 결과로부터

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

작업의 필요성이 무엇인지 알고 싶습니다.결과 방법에서?

즉, 다음과 같습니다.생산된 가치를 이미 눈앞에 둔 시나리오에서 이를 다시 작업으로 포장할 필요성은 무엇입니까?

작업 인스턴스를 수락하는 다른 메서드에 대한 어댑터로 사용된다는 것만 생각할 수 있습니다.

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

  1. 비동기 호출자를 허용하는 인터페이스를 구현하지만 구현이 동기화되는 경우.
  2. 테스트를 위해 비동기 코드를 스텁/모킹하는 경우.

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

반응형