zoukankan      html  css  js  c++  java
  • Task.FromResult应用场景举例

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

  • 相关阅读:
    PAT 1037. 在霍格沃茨找零钱(20)
    PAT 1036. 跟奥巴马一起编程(15)
    Topcoder SRM633 DIV2 解题报告
    HDU 4565 So Easy! 矩阵快速幂 + 共轭数
    HDU 2256 Problem of Precision 矩阵快速幂 + 共轭数
    FZU 1683 纪念SlingShot 矩阵快速幂
    CodeForces 185A Plant 矩阵快速幂
    HDU 2604 Queuing 矩阵快速幂
    HDU 1575 Tr A 矩阵快速幂
    HDU 1757 A Simple Math Problem 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/darrenji/p/4712504.html
Copyright © 2011-2022 走看看