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? 😄
Wie hat man sich denn dieses "Aufhängen" vorzustellen?
Das Programm reagiert nicht mehr?
Das Programm stürzt mit einer Exception ab?
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.
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
}
await GoogleWebAuthorizationBroker.AuthorizeAsync
geht auch nicht (s. Bild)
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.
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
Ähhm, ja, mit async
wird es ein Task.
Dazu gibt es eine Menge Dokumentation im Web, was das bedeutet und wie es funktioniert.
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 😉)
Hast du mal in das Repository dieser API geschaut? Da gibt es auch einen Bereich, der nennt sich Issues. Den solltest du mal durchgehen.
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 😃