同步调用异步方法时出错

时间:2014-03-07 16:29:20

标签: c# asynchronous geolocation async-await

我正在桌面应用程序中编写代码,该应用程序将用于警车以使用新的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 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&LT; Windows.Devices.Geolocation.Geoposition&GT;'不包含'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;
}

3 个答案:

答案 0 :(得分:4)

谢谢Scott的帮助。我能够找出哪些DLL可以从您的建议中添加引用。然后尝试一下。

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

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

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

我希望MS能够添加有关哪些DLL需要引用的信息,以便将VS2012中的Windows 8 API用于其文档。

答案 1 :(得分:1)

可能重复的问题,但是如果你还没有添加对System.Runtime.WindowsRuntime.dll的引用。

答案 2 :(得分:1)

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

在我Exposing the Geolocator as a Reactive Service上写Nokia Developer Wiki的调查时,我遇到了同样的问题(没有更改事件)并尝试了同样的解决方案(调用Geolocator.GetGeopositionAsync)。

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

如果您不熟悉Reactive Extensions (Rx),则应该尝试一下。您可以从my CodeProject Workspace获得我的实施。