我是C#的新手,并将一些Swift蓝牙LE代码转换为C#UWP。
我的代码工作使用async / await。但是为了使它类似于我在Swift中所拥有的内容,我认为我非常希望在异步API完成时获得回调。
例如,快速代码:
private func connect_to( per : CBPeripheral) {
centralManager?.connect( per, options: nil)
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
peripheral.delegate = self
peripheral.discoverServices([transferServiceUUID])
}
第二个功能是回拨。目前在C#中我有这样的事情:
private async void ConnectByID_OrAddr( UInt64 btAddr)
{
btLEDev = await BluetoothLEDevice.FromBluetoothAddressAsync(btAddr);
if (btLEDev == null) {
// TODO: failure notifications...
return;
}
GattDeviceServicesResult result =
await btLEDev.GetGattServicesAsync(BluetoothCacheMode.Uncached);
// etc.
}
我看到了在C#中使用Delegates的引用,但我不清楚如何使用API调用来执行此操作。
答案 0 :(得分:2)
您可以使用ContinueWith
在C#中链接Tasks
,方式与{J}中Promisses
then
链接的方式相同。
private static void ConnectByID_OrAddr2(UInt64 btAddr)
{
BluetoothLEDevice.FromBluetoothAddressAsync(btAddr)
.ContinueWith(btLEDevTask => // Callback for when first task completes
{
var btLEDev = btLEDevTask.Result;
if (btLEDev == null)
{
// TODO: failure notifications...
return Task.FromResult<GattDeviceServicesResult>(null);
}
return btLEDev.GetGattServicesAsync(BluetoothCacheMode.Uncached);
})
.Unwrap()
.ContinueWith(resultTask =>// Callback for when second task completes
{
var result = resultTask.Result;
Console.WriteLine("Result:" + result);
});
}
<强> Oppinion 强>:
除非有充分理由,否则请不要使用ContinueWith
版本。就个人而言,我发现这种代码风格非常难以理解,并且希望随时都能使用async / await版本。您应该尝试使用您使用的任何编程语言的功能,而不是试图使代码看起来像您以前使用的语言。