#c#
#c#
Вопрос:
Я пытаюсь реализовать счетчик в моем wpf. Если данные извлекаются, счетчик должен быть показан, но как только все данные будут извлечены, счетчик должен быть скрыт. Я знаю, что должен использовать async и ждать, пока это сработает, но мой приведенный ниже код не работает.
private async Task onGetFiles(object sender, RoutedEventArgs e)
{
if (txtIpAddress.Text.Contains("IP Address"))
{
MessageBox.Show("Ip Address is invalid");
return;
} else if (string.IsNullOrEmpty(dpDate.Text))
{
MessageBox.Show("Date is invalid");
return;
}
var date = dpDate.Text;
var splitDate = date.Split('/');
int month = Convert.ToInt32(splitDate[1]);
int day = Convert.ToInt32(splitDate[0]);
var year = splitDate[2];
var filePath = $@"\{txtIpAddress.Text}iHardware Interfacing{year}{month}{day}PeripheralLogsDq.txt";
using (new ImpersonateUser("username", "", "password"))
{
IsWaveActive = true;
await Task.Run(() => LoadLogs(rbQueue, File.ReadAllText(filePath)));
await Task.Run(() => LoadLogs(rbQueue, File.ReadAllText(filePath)));
IsWaveActive = false;
}
}
private bool LoadLogs(RichTextBox rtb, string msg)
{
try
{
FlowDocument flowDocument = new FlowDocument();
Paragraph paragraph = new Paragraph();
paragraph.Inlines.Add(new Run(msg));
flowDocument.Blocks.Add(paragraph);
rtb.Document = flowDocument;
return true;
}
catch
{
return false;
}
}
Моя ошибка
Error CS0407 'Task MainWindow.onGetFiles(object, RoutedEventArgs)' has the wrong return type MenuAnimation C:UsersRodneOneDriveDesktopAnimatedMenu1-masterMenuAnimationMainWindow.xaml 188 Active
Я получаю эту ошибку при попытке компиляции, поэтому я не могу ее запустить.
Комментарии:
1. Прежде всего, пожалуйста, не публикуйте сообщения об ошибках в виде изображений, поместите текст в текст вопроса. Кроме того, в какой строке ошибка? Что такое
onGetFiles
? Нам нужно больше информации.2. В сообщении об ошибке указано
Task MainWindow.onGetFiles(...)
, но вы не выполняли эту функцию. Из какого контекста вызывается оператор using?3. Использование — это просто мой способ доступа к сети. У меня нет проблем с этим. моя проблема заключается в том, когда я вызываю ожидание Task.Run…
4. Что это за
MainWindow.onGetFiles
функция? Можете ли вы добавить это к вопросу? Также бит кода, в котором вы вызываетеonGetFiles
/ передаете его делегату.5. Пожалуйста, посмотрите мою правку.
Ответ №1:
К сожалению, обработчики асинхронных событий (которые onGetFiles
, похоже, есть) часто должны быть объявлены async void
1, а не async Task
.
Это прискорбно, поскольку это означает, что нет способа определить, когда они закончили выполнять свою работу, используя обычную Task
инфраструктуру.
Однако, если IsWaveActive
это то, как вы достигаете функции «показывать счетчик до завершения», это должно работать просто отлично.
1 Потому что тип делегата для обработчика события, будучи разумным, объявляется как void
возвращаемый, а не имеющий какого-либо типа возвращаемого значения.
Ответ №2:
У вас await
есть метод async onGetFiles
? Вам лучше переименовать метод в onGetFilesAsync
, чтобы вы не забыли его дождаться!