Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
UI-Thread-Code in DLL auslagern
Fabiano
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

UI-Thread-Code in DLL auslagern

beantworten | zitieren | melden

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
Attachments
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16214

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers