需要帮助以异步任务的方式获取“联系位置”信息(在wp中有效)

拉娜·侯赛因(Rana Hossain)

我有以下方法,希望有人可以帮助我;它使用MvvmCross IMvxLocationWatcher。基本上,这个想法是从封装观察者的方法中获取MvxGeoLocation结果。

    protected internal static async Task<MvxGeoLocation> GetCurrentLocationAsync()
    {
        const int timeoutInMs = 5000;
        return await Task.Factory.StartNew(() =>
        {
            MvxGeoLocation result = null;

            // wait event
            var manualResetEvent = new ManualResetEvent(false);

            var locationWatcher = Mvx.Resolve<IMvxLocationWatcher>();
            locationWatcher.Start(new MvxLocationOptions {Accuracy = MvxLocationAccuracy.Coarse},
                // success
                location =>
                {
                    result = location;
                    manualResetEvent.Set();
                },
                // fail
                error =>
                {
                    result = null;
                    manualResetEvent.Set();
                });

            // all done
            manualResetEvent.WaitOne(timeoutInMs);

            locationWatcher.Stop();

            return result;
        });
    }

该代码可以在WindowsPhone中正常工作。ResetEvent保存我从结果中设置的事件。

但是,在MonoTouch(iOS)中,我什么也没得到,并且重置事件超时(没有任何超时,它永远不会返回)。

通过将locationWatcher设置为全局类变量而不是停止它,我可以看到该方法存在后立即返回定位结果。

我想我可以尝试其他几件事;Thread.Sleep(我觉得很丑)和Locking(但我认为ResetEvent几乎以相同的方式工作)。

还是这是monoTouch的线程问题和实现?有任何建议吗?

提前致谢。

拉那

斯蒂芬·克莱里

我对IMvxLocationWatcher实现的线程模型不熟悉但是,您可能会在UI线程上获得更好的结果(并且绝对会有更好的性能):

protected internal static Task<MvxGeoLocation> GetCurrentLocationAsync()
{
    var tcs = new TaskCompletionSource<MvxGeoLocation>();
    const int timeoutInMs = 5000;
    var locationWatcher = Mvx.Resolve<IMvxLocationWatcher>();
    locationWatcher.Start(new MvxLocationOptions {Accuracy = MvxLocationAccuracy.Coarse},
        // success
        location => tcs.TrySetResult(location),
        // fail
        error => tcs.TrySetException(error));
    return tcs.Task;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Android中有效管理多个异步任务

SyntaxError:“await”仅在“async”函数中有效 - 需要帮助

RegExp帮助(有效,但需要排除)

等待仅在异步功能中有效

等待仅在异步功能中有效

Javascript 函数 await 仅在异步函数中有效

Javascript:SyntaxError:等待仅在异步函数中有效

for循环中的“ await仅在异步函数中有效”

For 循环 - SyntaxError: await 仅在异步函数中有效

等待仅在异步功能中有效

NodeJs等待仅在异步功能中有效

错误:等待仅在异步功能中有效

以有效的方式从另一行获取信息

等待异步任务安全和有效的方法

地理位置仅在Chrome中有效

位置粘性在 Firefox 中有效,在 Chrome 中无效

在联系人ID的帮助下获取联系人的所有详细信息

最有效的存储位图信息的方式

获取Go中有效时区的列表

C#暂停异步任务在一种方法中有效,但在另一种方法中无效

给出 await 的异步函数仅在异步函数中有效

await仅在异步功能中有效-异步中的eval

“await 仅在异步函数中有效”,而它是一个异步函数

等待仅在异步函数中有效,同时我已经在函数中放置了“异步”

需要检查信用卡有效期是否在Java中有效

SyntaxError:await 仅在带有 Apify Metamorph 的异步函数中有效

以最有效的方式获取间隔期间的事件数

以有效的方式从 Django 的表单中获取值

获取 SyntaxError: await 仅在异步函数和模块的顶层主体中有效,同时通过 discord.js 指南工作