Laden...

Falls bei Auth an der Google API das Fenster geschlossen wird, hängt sich das Programm auf

Erstellt von xxldoener vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.334 Views
X
xxldoener Themenstarter:in
19 Beiträge seit 2016
vor 7 Jahren
Falls bei Auth an der Google API das Fenster geschlossen wird, hängt sich das Programm auf

Hallo zusammen,
Ich habe in mein Programm die Google-Calendar-API implementiert, um Termine in einen Kalender einzutragen. Bei der Authentifizierung geht da ja so eine Website auf, wo man entweder "Zulassen" oder "Verweigern" drücken kann. Mein Problem ist jetzt: Wird der Tab geschlossen, ohne das etwas gedrückt wird, so hängt sich das Programm auf. Also habe ich mir gedacht, verwende ich einfach die Möglichkeit, für die Aktion den CancelationToken nach einer gewissen Zeitspanne auf .Cancel zu setzen. Allerdings bringt das nichts, die Aktion wird nicht unterbrochen und es tut sich nix. Hier der Code für die Google Authentifizierung:

UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                        secrets,
                        new string[]
                        {
                                CalendarService.Scope.Calendar
                        },
                        "user",
                        CancelGoogleConnectionSource.Token)
                .Result;

Ich habe jetzt einen Button, der auf Knopfdruck das Cancel-Event nach 10sek. ausführen soll und dann mit der Authentifizierung beginnt:

CancelGoogleConnectionSource.CancelAfter(10000);

Was mache ich da denn falsch? Oder überprüft der Code von google den Token vlt. nur alle 30 Minuten? 😄

D
985 Beiträge seit 2014
vor 7 Jahren

Wie hat man sich denn dieses "Aufhängen" vorzustellen?

Das Programm reagiert nicht mehr?
Das Programm stürzt mit einer Exception ab?

X
xxldoener Themenstarter:in
19 Beiträge seit 2016
vor 7 Jahren

Wie hat man sich denn dieses "Aufhängen" vorzustellen?

Das Programm reagiert nicht mehr?
Das Programm stürzt mit einer Exception ab?

Das Programm friert einfach ein. Es wirft keine Exception, aber sämtliche Steuerelemente reagieren nicht mehr auf Anklicken.

D
985 Beiträge seit 2014
vor 7 Jahren

Logisch, du blockierst ja auch den weiteren Ablauf:


var something = GetSomethingAsync().Result; // blockierender Aufruf!
// irgendwas mit something machen

Die Beispiele von Google sehen da auch anders aus:


public async void Button_Click( ... )
{
    var something = await GetSomethingAsync(); // blockiert nicht!
    // irgendwas mit something machen
}

X
xxldoener Themenstarter:in
19 Beiträge seit 2016
vor 7 Jahren
await GoogleWebAuthorizationBroker.AuthorizeAsync

geht auch nicht (s. Bild)

D
985 Beiträge seit 2014
vor 7 Jahren

Hast du dir das auch angesehen?

Schau dir bitte einmal genau meinen BeispielCode an und achte auf das async in meinem Code und dann lies dir bitte die Fehlermeldung nochmal genau durch.

Und auch das Result schau dir nochmal genau in meinem BeispielCode an. In der async Methode habe ich das nicht drin.

X
xxldoener Themenstarter:in
19 Beiträge seit 2016
vor 7 Jahren

Ah ich habe es glaube ich verstanden. Dann neue Frage: Gibt es eine Möglichkeit einen bool zurückzugeben ob das ganze erfolgreich war? Ich kann als Ausgabe immer nur Tasks definieren

D
985 Beiträge seit 2014
vor 7 Jahren

Ähhm, ja, mit async wird es ein Task.

Dazu gibt es eine Menge Dokumentation im Web, was das bedeutet und wie es funktioniert.

X
xxldoener Themenstarter:in
19 Beiträge seit 2016
vor 7 Jahren

Danke soweit schon mal, ich wühl mich mal durch das Netz und lese mich schlau. Dass mit dem await hat mir sehr geholfen (denke ich zumindest 😉)

D
985 Beiträge seit 2014
vor 7 Jahren

Hast du mal in das Repository dieser API geschaut? Da gibt es auch einen Bereich, der nennt sich Issues. Den solltest du mal durchgehen.

X
xxldoener Themenstarter:in
19 Beiträge seit 2016
vor 7 Jahren

Ok, um es zusammenzufassen: Das .Result hat mir das Genick gebrochen, weil es kein async zulässt. Das hast du weiter oben geschrieben, aber ich habe das wohl überlesen. Viele Dank, jetzt funktioniert alles so wie es soll 😃