使用Task.Run(),您可以运行任何方法async,例如
public int Increase(int val)
{
return val + 1
}
int increased = await Task.Run ( () => return Increase(3) );
是否可以创建扩展方法,只需像
那样运行任何方法asyncvar val = 1;
int increased = await Increased(3).AsAsync();
答案 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);