невозможно отменить backgroundWorker из бесконечного цикла в C # / XAML

1

Edit2:

После добавления ответа ниже я также должен был избавиться от своего заполнителя, 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();
}
  • 3
    sender , вероятно, не то, что вы думаете.
  • 1
    Разве Command в вашем XAML не должна быть привязана к EndCommand, а не к EndXmlImport?
Показать ещё 2 комментария
Теги:
xaml
wpf
backgroundworker

2 ответа

0
Лучший ответ

Код, который вы включаете в код 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();
}
  • 0
    Благодарю. У меня были и другие проблемы, когда я имел дело с бесконечным циклом, но мне, конечно, нужно было это, чтобы он заработал :)
0

Не следует ли привязать конечную кнопку к EndCommand? Как это

<Button Content="End" Style="{StaticResource LargeButton}"  Command="{Binding EndCommand}"/>

Если вы используете шаблон MVVM и привязаете свою виртуальную машину к представлению, вы можете переместить bgWorker на уровень класса, а затем ссылаться на функцию EndXmlImport, поскольку вы не можете получить отправителя на виртуальной машине.

Если вы используете код позади, то отправитель не является вашим BackgroundWorker, но скорее всего это экземпляр кнопки.

  • 0
    Итак, если я останусь с подходом с кодом позади, есть ли способ получить экземпляр backgroundworker и отменить его? Извините, я впервые использую XAML / C # / backgroundworker совместно
  • 0
    Затем просто используйте приватное поле для ссылки на Backgroundworker в своем коде за ... _backgroundWorker = new BackgroundWorker () и т. Д. Когда команда будет запущена (если вам удастся это сделать;), тогда проверьте, является ли _backgroundworker! = Null, и отмените ее. Может быть так, что в методе выполнения работника вы постоянно должны проверять, установлен ли флаг отмены, а затем предпринимать соответствующие действия ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню