ASP.NET Webforms mit async/await
Meine Webforms-Anwendung, die basiert auf .Net 4.6 hat die Verwendung der async/await-Funktionalität Recht umfangreich. Weil ich bin ziemlich neu hier im async - /await-Thema, ich lese ziemlich viel von best practices wie diese oder diese. Aber ich habe noch einige Fragen, für die ich nicht gefunden habe keine klaren Informationen.
- In Bezug auf Page-Lifecycle-Events: ich weiß, dass z.B. für das Page_Load-Ereignis ist es am besten Praxis, um zu vermeiden, async void-Methoden und registrieren solche Methoden wie diese:
protected void Page_Load(object sender, EventArgs e) { PageAsyncTask pageAsyncTask = new PageAsyncTask(SomeAsyncMethod); Page.RegisterAsyncTask(pageAsyncTask); //Method to invoke the registered async-methods immedietly and not after the PreRender-Event Page.ExecuteRegisteredAsyncTasks(); }
Mein problem ist, dass ich möchten, rufen Sie die async-Methode, sobald ich Sie registriert und nicht nach der OnPreRender-Ereignis. Erreicht werden soll dies durch den Aufruf der ExecuteRegisteredAsyncTasks()-Methode. Aber in meinem Fall hat keine Wirkung und die async-Methode ist immer noch aufgerufen wird, nachdem das PreRender-Ereignis. Aber warum?
- Über Steuerelement-Ereignisse: Ist es besser, sich zu registrieren async-Methoden auf die gleiche Weise, die ich erwähnt in dem code-Beispiel oben, oder kann ich den async void Signatur wie:
protected async void OnClick(object sender, EventArgs e) { await SomeAsyncMethod(); }
Ich fand die beiden Beispiele aber keine klaren Informationen, welche die bessere Lösung ist-und warum.
- Bezüglich Kontext und ConfigureAwait, ist es am besten zu sein scheint, die Praxis zu verwenden
await SomeAsyncMethod.ConfigureAwait(false)
für eine bessere performance und der Kontext nicht wichtig ist und es nicht zu verwenden, wenn der Zusammenhang z.B. bei der Manipulation der GUI-Elemente. Aber in meinem Fall scheint es keinen Unterschied zu machen, wenn ich den Anrufawait SomeAsyncMethod.ConfigureAwait(false)
in meiner click-Ereignis. Ich kann immer noch manipulieren, meine GUI-Elemente ohne irgendwelche Probleme. Das Beispiel, das ich verwendet, war dies:private async void button1_Click(object sender, EventArgs e) { button1.Enabled = false; try { await SomeAsyncMethod().ConfigureAwait(false); } finally { //Manipulating still works even it's another context button1.Enabled = true; } }
Also ich Frage mich, warum die Manipulation der GUI-Elemente funktionieren noch und wenn ich Sie wirklich verwenden soll ConfigureAwait(false) auf jede async-Methode, wo der Kontext nicht wichtig, die ist ziemlich langweilig. Ich Frage mich, ob das hat etwas zu tun mit der Verwendung des Ajax-Funktionalität, die von Telerik die ich für meine Webapplication. Aber das ist nur eine Annahme.
Ok, danke für die Bearbeitung.
Es gibt keine GUI in eine ASP.NET -Anwendung. WebForms gibt Sie ein Modell, das aussieht wie eine GUI, aber es ist nicht. Das sagte, ich glaube nicht, rufen
ConfigureAwait(false)
bei dieser Methode ist zu nennen, in ASP.NET APIs (wie button1.Enabled
). Die meisten APIs, die nur gut funktionieren, aber es gibt ein paar, die scheitern, so dass ich nur auf Nummer sicher.InformationsquelleAutor F. Huber | 2017-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
ASP.NET WebForms hat seine eigenen asynchronen Motor. Bitte refere die Dokumentation.
In jedem Fall, Sie in der Regel wollen (oder müssen), um wieder auf die aktuelle Synchronisierung Kontext, auf Methoden wie event-Handler, so sollten Sie nicht nennen
ConfigureAwait(false)
innenbutton1_Click
, aber Sie sollten es innerhalbSomeAsyncMethod
.Was ist
SomeAsyncMethod()
tun und was denken SiePage.ExecuteRegisteredAsyncTasks()
einwandfrei arbeitet? Ich immer noch lieber zu registrieren, dass alle asynchronen arbeiten und lassen Sie es ausführen automatisch greifen die Werte vor dem Rendern.E. g.
SomeAsyncMethod()
lädt einige Daten auf der pageload-Ereignis. Diese Daten sind notwendig, z.B. in einem button-click-Ereignis. Das problem ist, dass die async-Methode wird ausgeführt, nachdem das prerender-Ereignis, das ist zu spät für das click-Ereignis. Deswegen dachte ich, ich könntePage.ExecuteRegisteredAsyncTasks()
. Aber das aufrufen dieser Methode hat keine Wirkung, undSomeAsyncMethod()
ist immer noch aufgerufen, nachdem das prerender-EreignisInformationsquelleAutor Paulo Morgado
Meiner einfachen Methode für Asp.net 4.5 webforms:
1) erklären aspx-Seite mit diesem Attribut
2) Erstellen Sie das void-Methode im code:
3) Rufen Sie die Methode MyAsyncMethod:
InformationsquelleAutor Lorenzo Battaglia