Laden...

UI-Thread-Code in DLL auslagern

Erstellt von Fabiano vor 2 Jahren Letzter Beitrag vor 2 Jahren 244 Views
F
Fabiano Themenstarter:in
27 Beiträge seit 2021
vor 2 Jahren
UI-Thread-Code in DLL auslagern

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

16.834 Beiträge seit 2008
vor 2 Jahren

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.