我可以使用await转换代码来代替使用回调

时间:2017-09-12 04:04:40

标签: c# async-await

我是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​​调用来执行此操作。

1 个答案:

答案 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版本。您应该尝试使用您使用的任何编程语言的功能,而不是试图使代码看起来像您以前使用的语言。