Ich habe eine Windows-Formular-Anwendung mit einem Knopf, der die folgenden Aktion auslöst:C# Task-Steuerablauflogik nicht richtig funktioniert
private async void timeStampDocuments_Click(object sender, System.EventArgs e)
{
await PerformTask(TimeStampPdfs());
}
Die PerformTask
Methode ist wie folgt:
private async System.Threading.Tasks.Task PerformTask(System.Threading.Tasks.Task task)
{
if(documentsView.CheckedItems.Count > 0)
{
Enabled = false;
try
{
await task;
}
catch(System.Exception e)
{
System.Windows.Forms.MessageBox.Show("Exception: " + e.Message);
}
progressBar.Value = 0;
progressBar.Text = string.Empty;
Enabled = true;
}
else
{
System.Windows.Forms.MessageBox.Show("Please select at least one document.");
}
}
Das Problem ist, Selbst wenn die Bedingung falsch ist (documentsView.CheckedItemsCount
ist gleich 0), wird die Task weiterhin ausgeführt. Sobald die Aufgabe jedoch beendet ist, wird eine MessageBox mit der Meldung "Bitte wählen Sie mindestens ein Dokument aus" angezeigt.
Wenn es hilft, die TimeStampPdfs
Methode ist:
private System.Threading.Tasks.Task TimeStampPdfs() => System.Threading.Tasks.Task.Run(() =>
{
for (int i = 0; i < documentsView.CheckedItems.Count; i++)
{
var currentDocument = documentsView.CheckedItems[i].ToString();
if (!string.Equals(
System.IO.Path.GetExtension(currentDocument), ".pdf", System.StringComparison.InvariantCultureIgnoreCase))
{
currentDocument = ConvertToPdf(currentDocument);
}
TimeStampPdf(currentDocument);
Report(new ProgressReport
{
Total = documentsView.CheckedItems.Count,
CurrentCount = i + 1
});
}
}).ContinueWith(t =>
{
System.Windows.Forms.MessageBox.Show("Files saved with time-stamp on print script in " + OutputRootPath);
},
System.Threading.CancellationToken.None,
System.Threading.Tasks.TaskContinuationOptions.OnlyOnRanToCompletion,
System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext()
);
Ich weiß, dass es läuft, weil die „Dateien mit Zeitstempel auf dem Druck Skript gespeichert in ...“ Meldungsfeld angezeigt wird.
ich sehe nicht, wie das kompiliert auch, weil 'TimeStampPdf' als void-Methode definiert ist, und doch sind Sie seinen * Rückgabewert mit (?) *' PerformTask' zu nennen ?? – sstan
Sie übergeben auch keine 'Zeichenfolge' an' TimeStampPdf', wenn Sie sie aufrufen. – juharr
@sstan Sorry, die falsche Methode gepostet. Ich habe zwei, die ähnliche Namen haben und in Eile einen sorglosen Fehler gemacht haben. Die richtige Methode ist jetzt in Frage. –