运行任何C#方法异步。可能?

时间:2016-09-09 17:44:26

标签: c# async-await

使用Task.Run(),您可以运行任何方法async,例如

public int Increase(int val)
{
   return val + 1
}


int increased = await Task.Run ( () => return Increase(3) );

是否可以创建扩展方法,只需像

那样运行任何方法async
var val = 1;
int increased = await Increased(3).AsAsync();

2 个答案:

答案 0 :(得分:2)

你无法编写一个exchange(..)方法来做你所建议的。在代码import org.springframework.web.client.RestTemplate; import org.springframework.http.HttpMethod; import org.springframework.core.io.Resource; ResponseEntity<Resource> responseEntity = restTemplate.exchange( someUrlString, HttpMethod.GET, someHttpEntity, Resource.class ); InputStream responseInputStream; try { responseInputStream = responseEntity.getBody().getInputStream(); } catch (IOException e) { throw new RuntimeException(e); } // use responseInputStream 中,您已经同步执行AsAsync并在调用Increased(3).AsAsync()之前计算其结果。在继续之前不执行该代码为时已晚。

答案 1 :(得分:1)

如果你有一个CPU绑定任务,并且你想使用async作为CPU绑定操作的方便包装器,你可以定义一个扩展(模糊地基于这个GetTask示例)

public static class AsyncExtensions
{
    public static Task<U> AsCpuBoundAsync<T,U>(this Func<T,U> func, T t) 
    {
        return Task.Run(() => func(t));  
    }
}

包装函数

    public static int Increase(int val)
    {
       //doing CPU bound activities...
       return val + 1;
    }

如下

   int increased = await ((Func<int,int>)(t =>
       Increase(t))).AsCpuBoundAsync(3);