Windows Phone 上的 GeocodeQuery 中的跨线程访问无效

本文关键字:线程 访问 无效 Phone 上的 GeocodeQuery Windows | 更新日期: 2023-09-27 18:35:49

我正在为 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");不应该返回无效的跨线程访问。在互联网的某个地方,我遇到了一个人,他说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 正确执行此操作?有人对此有所经验吗?

Windows Phone 上的 GeocodeQuery 中的跨线程访问无效

GeocodeQuery 只能在主/UI 线程上创建。确保仅从主/UI 线程调用转换到地理坐标方法。

例如,您可以使用调度程序:

Dispatcher.BeginInvoke(async() => { ... });

(我尝试了您的确切代码,当从 UI 线程调用时,它与 await 配合使用。