Hallo zusammen!
Wenn ich in einem Clickhandler eine async-Methode awaite, funktioniert das problemlos:
private async void Knopf_Click(object sender, RoutedEventArgs e)
{
var id = "BluetoothLE#BluetoothLE12:34:56:78:90:12-12:34:56:78:90:12";
var dev = await BluetoothLEDevice.FromIdAsync(id); // funktioniert
//var dev = Creator.GetDevice(id, Application.Current.Dispatcher.Invoke); // funktioniert nicht
Text.Text = dev.DeviceId;
}
Der gleiche Code in einer Library funktionert aber nicht:
public static BluetoothLEDevice GetDevice(string deviceId, Func<Func<Task>,Task> invoke)
{
BluetoothLEDevice ret = null;
invoke(async () => {
ret = await BluetoothLEDevice.FromIdAsync(deviceId);
});
return ret;
}
Hier wird nicht wirklich awaitet, sondern ret bleibt null.
Wie kann ich durchsetzen, dass auf die Rückkehr von BluetoothLEDevice.FromIdAsync gewaitet wird?
Liebe Grüsse,
Fabiano
Die korrekte Schreibweise wäre
public async Task<BluetoothLEDevice> GetDevice(string deviceId)
{
BluetoothLEDevice ret = await BluetoothLEDevice.FromIdAsync(deviceId).ConfigureAwait(false);
return ret;
}
bzw. wenn man zwingend die State Machine optimieren will
public Task<BluetoothLEDevice> GetDevice(string deviceId)
{
return BluetoothLEDevice.FromIdAsync(deviceId);
}
warum brauchst Du das Invoke Zeug? Das ist unnötig (und in diesem Fall grob falsch).
Und nur fürs Verständnis: async / await "wartet" nicht, sondern vereinfacht gesagt macht die State Machine erst weiter, wenn das Ergebnis da ist.
Technisch gesehen ist das aber kein warten, weil "warten" blockiert - tut async/await aber nicht.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code