繁体   English   中英

同步调用异步方法时出错

[英]Error calling async method synchronously

我在一个桌面应用程序中编写代码,该应用程序将在警车中使用,以使用新的Windows Geolocation API。 我已经为Geolocator.PositionChanged事件编写了一个事件监听器,但是没有被调用。 在我阅读文档时,似乎Gelocator仅在位置更改时引发此事件。

我认为程序完成设置事件侦听器后,应该做的第一件事是调用Geolocator.GetPositionAsync方法来获取当前位置,然后让该位置在发生时更新。

我需要同步调用Geolocator.GetPositionAsync方法。 为此,我编写了以下方法:

private async Task<Geoposition> GetCurrentPosition() {
    await Geolocator.GetGeopositionAsync();
}

但是,我在其中await的行中收到以下编译器错误:

“ await”要求类型“ Windows.Foundation.IAsyncOperation”具有合适的GetAwaiter方法。 您是否缺少针对“系统”的using指令?

这是文件顶部的using语句:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Serialization;
using Windows.Devices.Geolocation;

如何解决此编译器错误?

编辑

在添加对System.Runtime.WindowsRuntime.dll项目的引用后,错误消失了。 但是,现在我遇到了一个新错误:

'System.Runtime.CompilerServices.TaskAwaiter`1 <Windows.Devices.Geolocation.Geoposition>'不包含'IsCompleted'的定义

我该如何解决这个问题?

编辑

这是调用该方法的代码:

protected override void Initialize() {
    // Make sure we "forget" any previous Gelocator device
    if ( Geolocator != null ) {
        Geolocator.PositionChanged -= PositionChanged;
        Geolocator.StatusChanged   -= StatusChanged;
        Geolocator                  = null;
    }

    CurrentPosition = new GpsInformation() { TimeStamp = DateTime.Now };
    Geolocator = new Geolocator();
    Geolocator.DesiredAccuracy   = PositionAccuracy.High;    // Sends position updates with the highest accuracy possible.
    Geolocator.MovementThreshold = 0;                        // Sends position updates no matter how far the vehicle has moved since the last update.
    Geolocator.ReportInterval    = 0;                        // Sends position updates as they become availble.
    Geolocator.PositionChanged  += PositionChanged;          // Sends position updates to this method.
    Geolocator.StatusChanged    += StatusChanged;            // Sends status changed updates to this method.
    switch ( Geolocator.LocationStatus ) {
        case PositionStatus.Disabled:
        case PositionStatus.NotAvailable: 
            // The Geolocator device is disabled.  We won't get any updates.  Throw an exception.
            throw new Exception( "LPRCore does not have permission to use Windows Geolocation services or Geolocation services are not working." );
    }

    Task<Geoposition> getPositionTask = GetCurrentPosition();
    positionRecord = getPositionTask.Result;
}

谢谢你斯科特的帮助。 我能够从您的建议中找出要添加引用的DLL,然后尝试尝试失败。

要解决此问题,我需要添加对以下内容的引用:

  • System.Threading.dll
  • System.Threading.Tasks.dll

一旦这样做,错误就会消失。

我希望MS在其文档中添加有关使用VS2012中的Windows 8 API需要引用哪些DLL的信息。

可能存在重复问题,但如果尚未添加,则还应添加对System.Runtime.WindowsRuntime.dll的引用。

我认为您在尝试解决错误问题时遇到了这个问题。

在进行调查以在Nokia Developer Wiki上编写“ 将Geolocator作为响应式服务公开”时,我遇到了相同的问题(无更改事件),并尝试了相同的解决方案(称为Geolocator.GetGeopositionAsync )。

事实证明,您需要使用一些值来设置一些属性( Geolocator.MovementThresholdGeolocator.DesiredAccuracyGeolocator.ReportInterval )。

如果您不熟悉Reactive Extensions(Rx) ,则应该尝试一下。 您可以从CodeProject工作区获取我的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM