我只是从一本书中学习Async
编程,呵呵!他们的例子不起作用。
作者(WebAPI2书中的Adam Freeman,第3章,第47页!)想要说明一种技术,当我们拥有一系列同步语句并希望执行它们时,Async
。他说
这是通过创建一个启动任务来完成的,该任务围绕 我们需要执行并返回Task作为结果的语句 从该方法。
然后他说看这个例子。好惊喜!它甚至无法正常工作,因为它无法从long
转换为Task<long>
我应该如何解决此代码?
public interface ICustomController
{
Task<long> GetPageSize(CancellationToken cancellationToken);
}
public Task<long> GetPageSize(CancellationToken cancellationToken)
{
WebClient wb = new WebClient();
Stopwatch sw = Stopwatch.StartNew();
List<long> results = new List<long>();
for(int i=0; i<10; i++)
{
if (!cancellationToken.IsCancellationRequested)
{
Debug.WriteLine("Making Request {0} ", i);
results.Add(wb.DownloadData(TargetUrl).LongLength);
}
else
{
Debug.WriteLine("Cancelled...");
return 0;
}
}
Debug.WriteLine("Elapsed ms: {0} ", sw.ElapsedMilliseconds);
return (long)results.Average();
}
请注意,他已有意从方法中删除了aysnc
和await
,以便他可以解释此技术。.但是他忘记了实际修复代码。
答案 0 :(得分:7)
return Task.FromResult((long)results.Average());
这是从非异步函数返回等待结果的方式。
答案 1 :(得分:0)
我认为他想使用{
"widgets": [
{
"type": "metric",
"x": 0,
"y": 0,
"width": 24,
"height": 9,
"properties": {
"metrics": [
[ { "expression": "SEARCH('{statusdash/entitycount,Entity} MetricName=\"entitycount\"', 'Sum', 86400)", "id": "e1" } ]
],
"view": "singleValue",
"stacked": true,
"region": "eu-west-2",
"start": "-P1D",
"end": "P0D",
"title": "SearchEntityDash1"
}
}
]
将工作加载到线程池线程中。
您可以像
Task.Run()
然后,调用方将只能等待返回的public Task<long> GetPageSize(CancellationToken cancellationToken))
{
return Task.Run(() =>
{
// body of the original methode
});
}
对象。
详细了解Task
here。