2017-09-12 37 views
0

我是C#的新手,並將一些Swift Bluetooth LE代碼轉換爲C#UWP。我是否可以使用await轉換我的代碼而不是使用回調代碼

我有使用異步/等待的代碼工作。但爲了使它與我在Swift中的內容相似,我想我最好是在異步API完成時獲得回調。

例如,SWIFT代碼:

private func connect_to(per : CBPeripheral) { 
    centralManager?.connect(per, options: nil) 
} 

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { 
    peripheral.delegate = self 
    peripheral.discoverServices([transferServiceUUID]) 
} 

第二func被回叫。目前在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#中使用委託,但它不是我清楚如何使用API​​調用做到這一點。

+4

給異步等待一個機會,它確實使代碼更具可讀性,並從一個什麼它的視角與代碼的回調版本類似。 –

+0

這個問題還不清楚。您可以創建自定義委託定義,使用Action/Functions或創建回調接口並繼承一個類。但異步方式更具可讀性。 –

+0

我的問題是,我無法弄清楚如何做一個自定義的委託定義。但是,在這一點上,我認爲我確信使它與異步/等待一起工作。 – bobwki

回答

2

您可以使用ContinueWith以C#鏈接TasksPromisses與Javascript中的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版本。就我個人而言,我發現這種代碼風格很難遵循,並且隨時會喜歡異步/等待版本。您應該嘗試使用您使用的任何編程語言的功能,而不是試圖使代碼看起來像您以前工作的語言。

+2

謝謝。這正是我所期待的,但我認爲您對使用語言設施的評論是一個不錯的選擇。 Swift風格對委託回調具有很大的依賴性,並且可能會讓人感到壓抑 - 而且很混亂。 – bobwki

相關問題