После добавления ответа ниже я также должен был избавиться от своего заполнителя, while(true);
бесконечная петля. Это работает до сих пор и, вероятно, должно работать.
private void lookForXml(object sender, DoWorkEventArgs e)
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = @"\\filepath";
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite|
NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.xml";
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.EnableRaisingEvents = true;
BackgroundWorker bw = sender as BackgroundWorker;
while (!bw.CancellationPending) {
if (bw.CancellationPending)
{
e.Cancel = true;
}
}
}
После изменения моего XAML:
<Button Content="End" Style="{StaticResource LargeButton}" Command="{Binding EndCommand}"/>
Я получаю NullReferenceError в EndXmlImport, который говорит, что мой bgWorker не установлен в экземпляр объекта. Итак, я думаю, как мне связать кнопку отмены с процессом, который в настоящее время работает, чтобы я мог его отменить?
В настоящее время я пытаюсь написать программу, которая будет искать файлы XML в каталоге до тех пор, пока пользователь не остановит программу. Однако, похоже, я не могу связать нажатие кнопки отмены с отменой BackgroundWorker. Я не уверен, как я могу связать кнопку отмены в XAML, чтобы отменить процесс backgroundWorker.
XAML:
<Button Content="Import" Style="{StaticResource LargeButton}" Margin="0 20 0 0" Command="{Binding ImportCommand}"/>
<Button Content="End" Style="{StaticResource LargeButton}" Command="{Binding EndXmlImport}"/>
С#:
public SubmissionImporterViewModel()
{
ImportCommand = new RelayCommand(ImportSubmission) ;
EndCommand = new RelayCommand(EndXmlImport);
}
public void EndXmlImport(object sender)
{
BackgroundWorker bgWorker = sender as BackgroundWorker;
bgWorker.CancelAsync();
}
public void ImportSubmission(object o)
{
BackgroundWorker bgWorker = new BackgroundWorker();
bgWorker.DoWork += new DoWorkEventHandler(lookForXml);
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(afterCancel);
bgWorker.WorkerSupportsCancellation = true;
Status = "Looking for .xml files";
bgWorker.RunWorkerAsync();
}
Код, который вы включаете в код WPF? Если да, сделайте BackgroundWorker ссылкой на член, чтобы он был доступен в методе EndXmlImport.
public void EndXmlImport(object sender)
{
bgWorker.CancelAsync();
}
private BackgroundWorker bgWorker;
public void ImportSubmission(object o)
{
bgWorker = new BackgroundWorker();
bgWorker.DoWork += new DoWorkEventHandler(lookForXml);
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(afterCancel);
bgWorker.WorkerSupportsCancellation = true;
Status = "Looking for .xml files";
bgWorker.RunWorkerAsync();
}
Не следует ли привязать конечную кнопку к EndCommand? Как это
<Button Content="End" Style="{StaticResource LargeButton}" Command="{Binding EndCommand}"/>
Если вы используете шаблон MVVM и привязаете свою виртуальную машину к представлению, вы можете переместить bgWorker на уровень класса, а затем ссылаться на функцию EndXmlImport, поскольку вы не можете получить отправителя на виртуальной машине.
Если вы используете код позади, то отправитель не является вашим BackgroundWorker, но скорее всего это экземпляр кнопки.
sender
, вероятно, не то, что вы думаете.Command
в вашем XAML не должна быть привязана к EndCommand, а не к EndXmlImport?