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不帶返回值,就使用Task.FromResult(0) 或 Task.FromResult