Feuer Rückruf nach async-Task-Methode
Muss ich Feuer einen Rückruf, wenn der foreach
Schleife beendet hat, sucht sich durch jedes Element int die List<>
.
private async void startSearchBtn_Click(object sender, EventArgs e)
{
await Search(files, selectTxcDirectory.SelectedPath, status);
}
private static async Task Search(List<string> files, string path, Label statusText)
{
foreach (string file in files)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(file);
statusText.Text = "Started scanning...";
using (XmlReader reader = XmlReader.Create(new StringReader(xmlDoc.InnerXml), new XmlReaderSettings() { Async = true }))
{
while (await reader.ReadAsync())
{
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "LineName"))
{
Console.WriteLine(reader.ReadInnerXml());
}
}
}
}
}
Ist das möglich und wenn ja, wie kann es getan werden?
- Warum nicht einen Delegaten übergeben als parameter und rufen Sie im
foreach
Schleife, wo Sie brauchen, um? Bin ich etwas fehlt? - msdn.microsoft.com/it-it/library/system.asynccallback.aspx
- Sie sind an nichts fehlt, es ist, weil ich nicht weiß, was passieren einen Delegaten als Parameter aufrufen und es in der foreach-Schleife wird 😎 Könntest du bitte diesen post als Antwort?
- Ich habe als Antwort. überprüfen Sie, wenn dir das hilft
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist sehr einfach, geben Sie einfach eine Methode als Delegierter in-parameter. dann rufen Sie es, wo immer Sie brauchen.
Ich würde code wie unten. Auf diese Weise, die Sie noch immer verfolgen Sie die anstehende Aufgabe (
_pendingSearch
), währendstartSearchBtn_Click
bleibt synchron.Sollten Sie die Verfolgung von ausstehenden Aufgaben (und in der Lage sein zu stornieren). Ansonsten, kann der Benutzer klicken Sie auf
startSearchBtn
zweimal in Folge und spawnen zwei recherche-Aufgaben. Diese können möglicherweise immer noch ein gültiges Szenario in Ihrem Fall, aber in der Regel ist es nicht.[BEARBEITET] Mit
await
:await
?async void
event-Handler, die speziell zur Vermeidung von Feuer-und-vergessen. Dennoch, es ist möglich zu verfolgen, die anstehende Aufgabe innerhalbasync void
Methode, ich habe aktualisiert, der code um das zu zeigen.ContinueWith()
Beispiel_pendingSearch
stellt die Fortsetzung. In derawait
Beispiel, es ist dieSearch()
Task
.startSearchBtn_Click
sich alsTask
. Das ist ein weiterer Grund, warum ich immer noch gerne dieContinueWith
Ansatz. Wenn es implementiert die Musterwiderrufsbelehrung und ging ein token zuContinueWith
, würd wirksam kündigen, wird die callback-code zu. Natürlich, dieawait
version kann (und sollte) in diesem Fall behandeln mittry/catch
.Task
, würden Sie brauchen nur eine separateasync Task
Methode (oder vielleicht einasync Task
lambda).Da Sie mit
await
code instartSearchBtn_Click
nicht fortgesetzt wird, bisSearch
fertig ist.Alles, was Sie brauchen, ist etwas wie dieses: