FromBluetoothAddressAsync IAsyncOperation 不包含“GetAwaiter”错误的定义
Posted
技术标签:
【中文标题】FromBluetoothAddressAsync IAsyncOperation 不包含“GetAwaiter”错误的定义【英文标题】:FromBluetoothAddressAsync IAsyncOperation does not contain a definition for 'GetAwaiter' error 【发布时间】:2017-05-21 16:49:29 【问题描述】:我正在开发一个简单的 BLE UWP。我一直指的是“Windows UWP connect to BLE device after discovery”,在 Visual Studio 2017 中工作。
我的核心代码是:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Threading;
using Windows.Devices.Bluetooth.Advertisement;
using Windows.Devices.Bluetooth;
using Windows.Devices;
using Windows.Foundation;
using Windows;
namespace WindowsFormsApp2
public partial class Form1 : Form
private BluetoothLEAdvertisementWatcher watcher;
public Form1()
InitializeComponent();
watcher = new BluetoothLEAdvertisementWatcher();
watcher.Received += OnAdvertisementReceived;
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
var dev = await BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress);
排队
var dev = await BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress)
它给出了错误:
IAsyncOperation<Bluetooth> does not contain a definition for
'GetAwaiter' and the best extension method overload
'windowsRuntimeSystemExtensions.GetAwaiter(IAsyncAction)' requires a
receiver of type 'IAsyncAction'
我尝试添加对System.Runtime
、System.Runtime.WindowsRuntime
和Windows
的引用,但仍然出现此错误。
从我的搜索来看,原因似乎是FromBluetoothAddressAsync
方法应该返回一个Task。
从“BluetoothLEDevice Class”,我可以检查FromBluetoothAddressAsync
方法有这个签名:
public static IAsyncOperation<BluetoothLEDevice> FromBluetoothAddressAsync(
UInt64 bluetoothAddress,
BluetoothAddressType bluetoothAddressType
)
这意味着它返回IAsyncOperation<BluetoothLEDevice>
。在我看来,这似乎足以被视为Task<>
。
问题是由于链接断开导致IAsyncOperation<>
被识别为Task<>
的孩子吗?
【问题讨论】:
【参考方案1】:要等待IAsyncOperation
,您需要做两件事:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
的引用
对C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Facade\Windows.WinMD
的引用
如果缺少任何一个参考,那么它将不起作用。您也可以使用UwpDesktop nuget 包,它会为您完成工作。
注意:特别是 GetAwaiter
是 System
命名空间中的扩展名,可从这些引用中获得(您仍然需要 using System;
- 确保您没有从文件中删除它)。扩展信息在 MSDN -WindowsRuntimeSystemExtensions.GetAwaiter。
【讨论】:
非常感谢。 'UwpDesktop' 解决方案对我有用.. 现在弹出一个不同的错误,但至少等待错误没有出现。 恐怕构建 15063 代码永远无法通过对BluetoothLEDevice.FromBluetoothAddressAsync
的调用
另一个答案是真正的答案
System.Runtime.WindowsRuntime nuget 包对我有用。
System.Runtime.WindowsRuntime 成功了!谢谢【参考方案2】:
对于其他一些 UWP 操作,只需添加 using System
:
using System;
//...
// example - getting file reference:
var file = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync("myFile.txt);
【讨论】:
【参考方案3】:对于“.NET Standard 2.0”库项目,添加以下 Nuget:
https://www.nuget.org/packages/System.Runtime.InteropServices.WindowsRuntime/ https://www.nuget.org/packages/Microsoft.Windows.SDK.Contracts【讨论】:
以上是关于FromBluetoothAddressAsync IAsyncOperation 不包含“GetAwaiter”错误的定义的主要内容,如果未能解决你的问题,请参考以下文章