首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLGeocoder.ReverseGecode在50个请求后挂起

CLGeocoder.ReverseGecode在50个请求后挂起
EN

Stack Overflow用户
提问于 2013-10-11 10:09:57
回答 1查看 339关注 0票数 3

首先,我的代码:

代码语言:javascript
复制
private CLGeocoder _coder = new CLGeocoder();

private void TestWithTpl()
{
    Console.WriteLine("Test started");
    var testLocation = new CLLocation(52.268157,-1.4209);
    Task.Factory.StartNew(async () => 
    {
        for (var i=0; i < 100; i++)
        {
            Console.WriteLine("Starting iteration {0}", i);
            var res = await _coder.ReverseGeocodeLocationAsync(testLocation);
            Console.WriteLine(res[0].AdministrativeArea);
            Console.WriteLine("Finished iteration {0}", i);
        }
    });
    Console.WriteLine("Finished");
}

private void TestDefault()
{
    Console.WriteLine("Test started");
    var testLocation = new CLLocation(52.268157,-1.4209);
    Task.Factory.StartNew(() => 
    {
        for (var i=0; i < 100; i++)
        {
            Console.WriteLine("Starting iteration {0}", i);
            var res = _coder.ReverseGeocodeLocationAsync(testLocation).Result;
            Console.WriteLine(res[0].AdministrativeArea);
            Console.WriteLine("Finished iteration {0}", i);
        }
    });
    Console.WriteLine("Finished");
}

如您所见,TestWithTpl将使用异步并等待,而TestDefault只使用ReverseGeocodeLocationAsync的结果。

无论我使用哪种方法,输出都是这样的:

代码语言:javascript
复制
2013-10-11 12:05:54.882 AddressResolveTest[5290:a0b] Test started
Thread started: <Thread Pool> #3
Thread started: <Thread Pool> #4
2013-10-11 12:05:54.892 AddressResolveTest[5290:a0b] Finished
2013-10-11 12:05:54.897 AddressResolveTest[5290:6303] Starting iteration 0
2013-10-11 12:05:55.125 AddressResolveTest[5290:6303] England
2013-10-11 12:05:55.126 AddressResolveTest[5290:6303] Finished iteration 0
2013-10-11 12:05:55.127 AddressResolveTest[5290:6303] Starting iteration 1
...
2013-10-11 12:05:57.302 AddressResolveTest[5290:6303] Finished iteration 49
2013-10-11 12:05:57.302 AddressResolveTest[5290:6303] Starting iteration 50

最后一行之后什么也没发生。

我不知道,为什么

  1. “已完成”是在代码准备好之前编写的。
  2. 代码总是在请求50时停止
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-11 10:56:03

  1. “已完成”应该在开始时打印出来,至少对于TPL版本是这样,因为StartNew()在后台启动了一个任务,并继续执行。“默认”版本不应该是这样的。你能检查一下吗?
  2. 问题是StartNew()会吞并异常。如果您像这样更改代码:
代码语言:javascript
复制
Console.WriteLine("Test started");
var testLocation = new CLLocation(52.268157,-1.4209);
Task.Factory.StartNew(async () => 
    {
        try{
            for (var i=0; i < 100; i++)
            {
                Console.WriteLine("Starting iteration {0}", i);
                var res = await _coder.ReverseGeocodeLocationAsync(testLocation);
                Console.WriteLine(res[0].AdministrativeArea);
                Console.WriteLine("Finished iteration {0}", i);
            }
        }catch(Exception e){
            Console.WriteLine (e);
        }
    });
Console.WriteLine("Finished");

您将能够获得带有以下消息的ExceptionThe operation couldn’t be completed. (kCLErrorDomain error 2.)

谷歌搜索这条信息会让你在堆叠溢出上获得很多点击量,比如12这个答案甚至宣布了同样的“50”限制。

最后,我想说苹果限制了你每分钟可以做的请求数量,甚至是建议您不要过度使用API。

应用程序应该意识到它们如何使用地理编码。下面是一些有效使用该类的经验规则: 最多为任何一个用户操作发送一个地理编码请求.

希望能帮上忙。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19315545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档