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)。
