gpt4 book ai didi

c# - CLGeocoder.ReverseGecode 在 50 个请求后挂起

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:29 26 4
gpt4 key购买 nike

首先是我的代码:

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 的结果。

无论我使用两者中的哪一种方法:输出都会是这样的:

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.

最佳答案

  1. “完成”应该在开始时打印,至少对于 TPL 版本,因为 StartNew() 在后台启动任务,然后继续执行。 “默认”版本不应该是这种情况。你能查一下吗?

  2. 问题是 StartNew() 吞下了异常。如果您这样更改代码:

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");

您将能够获得带有消息的Exception:操作无法完成。 (kCLErrorDomain 错误 2。)

在谷歌上搜索这条消息会让你在 stackoverflow 上获得很多点击率,例如12 . This answer甚至宣布与您相同的“50”限制。

最后,我会说 Apple 限制了您每分钟可以执行的请求量,甚至 recommend you not to overuse the API :

Applications should be conscious of how they use geocoding. Here aresome rules of thumb for using this class effectively:

Send at most one geocoding request for any one user action.

希望对您有所帮助。

关于c# - CLGeocoder.ReverseGecode 在 50 个请求后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19315545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com