1. 程式人生 > 其它 >C# Task.FromResult的用法

C# Task.FromResult的用法

https://www.cnblogs.com/stilldream/p/10184778.html

Task.FromResult用來建立一個帶返回值的、已完成的Task。

場景一:以同步的方式實現一個非同步介面方法
比如有一個介面包含非同步方法。

interface IMyInterface
{
    Task<int> DoSthAsync();
}

現在需要以同步的方式實現該介面方法DoSthAsync,但要返回非同步的結果。這正是Task.FromResult的用武之地。

public class MyClass : IMyInterface
{
    public Task<int> DoSthAsync()
    {
        int result = 1;
        return Task.FromResult(result);
    }
}    

以上,在實現類MyClass的DoSthAsync方法中,都是以同步方式實現,但返回結果要是Task<int>,使用Task.FromResult剛好能返回一個帶值的非同步結果。

場景二:從快取中獲取值,以同步或者非同步的方式實現
假設需要根據key從快取中獲取值,如果每個key對應的快取不存在,就需要以非同步的方式獲取快取,如果存在,就直接中快取中獲取值。
寫一個非同步獲取快取的方法。

private async Task<string> GetValueAsync(int key)
{
    string result = await SomeAsyncMethod();
    cache.TrySetValye(key, result);
    return result;
}

現在需要寫一個方法用來獲取快取中的值,有可能是非同步方式,也有可能是同步的方式(從本地快取中獲取)。

public Task<string> GetValueFromCache(int key)
{
    string result = string.Empty;
    if(cache.TryGetValue(key, out result))
    {
        return Task.FromResult(result);
    }
    return GetValueAsync(key);
}

以上,從本地快取中獲取值是同步的方式,但方法返回的型別是非同步的Task,通過Task.FromResult(result)返回了非同步結果。

另外,如果使用Task.FromResult不帶返回值,就使用Task.FromResult(0) 或 Task.FromResult(null)。

轉https://www.cnblogs.com/stilldream/p/10184778.html