Windows Phone 上的 GeocodeQuery 中的无效跨线程访问
Invalid cross-thread access in GeocodeQuery on Windows Phone
我正在为 WP8 开发并具有以下代码
public static async Task<GeoCoordinate> ConvertToGeoCoordinate(String streetAddress)
{
// NOTE: constructor throws invalid cross thread exception
var query = new GeocodeQuery()
{
GeoCoordinate = new GeoCoordinate(0, 0),
SearchTerm = streetAddress,
MaxResultCount = 1,
};
var task = new TaskCompletionSource<GeoCoordinate>();
query.QueryCompleted += (s, ev) =>
{
foreach (var item in ev.Result)
task.TrySetResult(item.GeoCoordinate);
task.TrySetResult(null);
};
query.QueryAsync();
return await task.Task;
}
我不太熟悉任务、异步、等待等等,但我很确定调用 var res = await ConvertToGeoCoordinate("blabla");
不应该 return 无效的跨线程访问。在互联网的某个地方,我遇到了一个人,他说 GeocodeQuery 需要在 UI 线程上执行,但是如果我调用 ConvertToGeoCoordinate("blabla").ContinueWith((x) => {Log(x.Result.ToString();});
我会得到一个结果,这不是同步执行。
目前我正在做这样的事情(因为它有效)
ConvertToGeoCoordinate(addr1).ContinueWith(() => {
ConvertToGeoCoordinate(addr2).ContinueWith(() => {
ConvertToGeoCoordinate(addr2).ContinueWith(() => {
...
});
});
});
而不是(因为它不起作用)
await ConvertToGeoCoordinate(addr1);
await ConvertToGeoCoordinate(addr2);
await ConvertToGeoCoordinate(addr3);
...
这很尴尬。我该如何正确使用 GeocodeQuery?有人有这方面的经验吗?
GeocodeQuery 只能在 main/UI 线程上创建。确保仅从 main/UI 线程调用 ConvertoToGeocoordinate 方法。
例如,您可以使用调度程序:
Dispatcher.BeginInvoke(async() => { ... });
(我尝试了您的确切代码,当从 UI 线程调用时,它与 await 一起工作正常。)
我正在为 WP8 开发并具有以下代码
public static async Task<GeoCoordinate> ConvertToGeoCoordinate(String streetAddress)
{
// NOTE: constructor throws invalid cross thread exception
var query = new GeocodeQuery()
{
GeoCoordinate = new GeoCoordinate(0, 0),
SearchTerm = streetAddress,
MaxResultCount = 1,
};
var task = new TaskCompletionSource<GeoCoordinate>();
query.QueryCompleted += (s, ev) =>
{
foreach (var item in ev.Result)
task.TrySetResult(item.GeoCoordinate);
task.TrySetResult(null);
};
query.QueryAsync();
return await task.Task;
}
我不太熟悉任务、异步、等待等等,但我很确定调用 var res = await ConvertToGeoCoordinate("blabla");
不应该 return 无效的跨线程访问。在互联网的某个地方,我遇到了一个人,他说 GeocodeQuery 需要在 UI 线程上执行,但是如果我调用 ConvertToGeoCoordinate("blabla").ContinueWith((x) => {Log(x.Result.ToString();});
我会得到一个结果,这不是同步执行。
目前我正在做这样的事情(因为它有效)
ConvertToGeoCoordinate(addr1).ContinueWith(() => {
ConvertToGeoCoordinate(addr2).ContinueWith(() => {
ConvertToGeoCoordinate(addr2).ContinueWith(() => {
...
});
});
});
而不是(因为它不起作用)
await ConvertToGeoCoordinate(addr1);
await ConvertToGeoCoordinate(addr2);
await ConvertToGeoCoordinate(addr3);
...
这很尴尬。我该如何正确使用 GeocodeQuery?有人有这方面的经验吗?
GeocodeQuery 只能在 main/UI 线程上创建。确保仅从 main/UI 线程调用 ConvertoToGeocoordinate 方法。
例如,您可以使用调度程序:
Dispatcher.BeginInvoke(async() => { ... });
(我尝试了您的确切代码,当从 UI 线程调用时,它与 await 一起工作正常。)