Jaki jest pożytek z zadania.FromResult w C#

W C# i TPL ( Task Parallel Library) klasa Task reprezentuje trwającą pracę, która wytwarza wartość typu T.

Chciałbym wiedzieć, co jest potrzebne do zadania.Metoda FromResult ?

To znaczy: w scenariuszu, w którym masz już wyprodukowaną wartość pod ręką, jaka jest potrzeba, aby zawinąć ją z powrotem do zadania?

Przychodzi mi na myśl tylko to, że jest używany jako adapter dla innych metod akceptujących instancję zadania.

Author: lysergic-acid, 2013-10-24

5 answers

Są dwa typowe przypadki użycia, które znalazłem:

  1. Kiedy implementujesz interfejs, który umożliwia asynchroniczne wywołania, ale twoja implementacja jest synchroniczna.
  2. Kiedy stubujesz / wyśmiewasz kod asynchroniczny do testowania.
 164
Author: Stephen Cleary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-31 00:40:47

Przykładem może być metoda wykorzystująca pamięć podręczną. Jeśli wynik jest już obliczony, możesz zwrócić ukończone zadanie z wartością (używając Task.FromResult). Jeśli tak nie jest, to śmiało zwracasz zadanie reprezentujące trwającą pracę.

Przykład pamięci podręcznej: przykład pamięci podręcznej przy użyciu zadania.FromResult dla wstępnie obliczonych wartości

 37
Author: Matt Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-11 13:41:10

Użyj go, gdy chcesz utworzyć metodę awaitable bez użycia słowa kluczowego async. Znalazłem ten przykład:

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);
    }
}

Tutaj tworzysz własną implementację interfejsu IHttpActionResult do wykorzystania w akcji Web Api. Oczekuje się, że metoda ExecuteAsync będzie asynchroniczna, ale nie musisz używać słowa kluczowego async, aby uczynić ją asynchroniczną i oczekiwalną. Ponieważ masz już wynik i nie musisz na nic czekać, lepiej użyć zadania.FromResult.

 20
Author: Edminsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-03 15:31:54

Z MSDN:

Ta metoda jest przydatna podczas wykonywania operacji asynchronicznej, która zwraca obiekt zadania, a wynik tego obiektu zadania jest już obliczony.

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

 17
Author: goughy000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-24 14:26:20

Użyj zadania.FromResult, gdy chcesz mieć operację asynchroniczną, ale czasami wynik jest w ręku synchronicznie. Możesz znaleźć dobrą próbkę tutaj http://msdn.microsoft.com/en-us/library/hh228607.aspx .

 3
Author: Alborz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-08 07:05:09