У меня есть приложение в Windows Forms с помощью кнопки, которая вызывает следующие действия:C# Задача управления потоком логики не работает должным образом
private async void timeStampDocuments_Click(object sender, System.EventArgs e)
{
await PerformTask(TimeStampPdfs());
}
Метод PerformTask
выглядит следующим образом:
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.");
}
}
Проблема заключается в том что даже если условие ложно (documentsView.CheckedItemsCount
равно 0), задача по-прежнему выполняется. Однако, как только задача завершается, появляется MessageBox, говорящий «Пожалуйста, выберите хотя бы один документ».
Если это помогает, метод TimeStampPdfs
является:
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()
);
Я знаю, что это работает, потому что «Файлы, сохраненные с отметкой времени на печать сценария в ...» отображается окно с сообщением.
Я не вижу, как это даже компилируется, потому что 'TimeStampPdf' определяется как метод ничтожной, и все же вы используете ее * возвращаемое значение (?) * назвать' PerformTask' ?? – sstan
Также вы не передаете 'string' в' TimeStampPdf', когда вы его вызываете. – juharr
@sstan Извините, вы отправили неправильный метод. У меня есть два, которые имеют похожие имена, и совершили неосторожную ошибку в спешке. Правильный метод теперь находится в вопросе. –