为什么我在这个C#wpf应用程序中得到这个InvalidOperationException

本文关键字:InvalidOperationException C#wpf 为什么 应用程序 | 更新日期: 2023-09-27 18:20:08

我有一个C#(WPF)程序,可以搜索目录中的文件,我想要一个进度条来显示我搜索目录中文件的进度(因为一个目录中可能有数千个文件)。

我决定使用后台工作者,以便进度条正确更新(这并没有发生,但这不是我最大的问题)。

目前的情况是,它有时会起作用,这非常奇怪,但大多数时候我都会遇到这个错误。我唯一没有得到这个错误的时候是,如果我在foreach(document in myDirectory)循环中添加一个MessageBox.Show();来减慢它的速度,并查看它所在的文件号。然后它只会偶尔出错。

有人能向我解释为什么我会出现这个错误,以及如何修复它吗?此外,如果你认为有更好的方法来显示进度条,请不要犹豫,纠正我正在做的事情。

我的错误

System.dll中发生类型为"System.InvalidOperationException"的异常,但未在用户代码中处理

附加信息:此操作已调用OperationCompleted,进一步的调用是非法的。

myApp.xaml.cs

BackgroundWorker backgroundWorker1;
public void searchFiles()
{
    //50 files in the directory
    int fileCount = 50;
    int documentCounter = 0;
    //For every file in the directory
    foreach(document in myDirectory)
    {
    //increment the file count
    documentCounter++;
    FileSearchProgressBar(documentCounter, fileCount);
    }
}
private void FileSearchProgressBar(int currentDocNumber, int count)
{
    backgroundWorker1 = new BackgroundWorker();
    backgroundWorker1.WorkerReportsProgress = true;
    backgroundWorker1.DoWork += (obj, ea) => CalculateProgress(currentDocNumber, count);
    backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(progressReport);
    backgroundWorker1.RunWorkerAsync();
}
void progressReport(object sender, ProgressChangedEventArgs e)
{
    progBar.Value = e.ProgressPercentage;
}
private void CalculateProgress(int currentDocNumber, int count)
{
    //This is where the error is reporting
    backgroundWorker1.ReportProgress(currentDocNumber * (100 / count));
}

EDIT1

堆栈跟踪

System.InvalidOperationException: This operation has already had OperationCompleted called on it and further calls are illegal. at System.ComponentModel.AsyncOperation.VerifyNotCompleted() at System.ComponentModel.AsyncOperation.Post(SendOrPostCallback d, Object arg) at System.ComponentModel.BackgroundWorker.ReportProgress(Int32 percentProgress, Object userState) at System.ComponentModel.BackgroundWorker.ReportProgress(Int32 percentProgress) at HR_Search_Program.MainWindow.CalculateProgress(Int32 currentDocNumber, Int32 count) in c:'Users'myname'Documents'Visual Studio 2013'Projects'myproject'myproject'MainWindow.xaml.cs:line 589

为什么我在这个C#wpf应用程序中得到这个InvalidOperationException

您发布的代码甚至无法编译。它在语法上不正确。如果没有一个好的、最小完整的代码示例来可靠地再现问题,就不可能确切地知道问题是什么,更不用说最好的解决方案是什么了。但在你的文章中有一些线索:

  • 异常清楚地表明,您的代码正试图在代表已完成操作的BackgroundWorker对象上调用ReportProgress()方法
  • 启动BackgroundWorker的代码为myDirectory集合中的每个文档创建一个新实例,并将此新实例的引用分配给单个变量backgroundWorker1

由于BackgroundWorker有多个实例同时运行,但一次只能跟踪单个实例,因此最有可能是一个稍后启动的实例首先完成,而一个较早启动的实例正在尝试报告进度,但只能使用稍后启动的引用来报告进度。由于那个较晚启动的实例已经完成,则抛出异常。

一个解决方案是简单地让CalculateProgress()方法将发送给DoWork事件处理程序的BackgroundWorker引用作为参数。这样,BackgroundWorker的每个实例都将使用本身来报告进度,而不是尝试使用最近启动的实例。

但是,首先使用多个BackgroundWorker实例似乎不是一个好主意。一个更好的实现是BackgroundWorker的单个实例,其中枚举文档的循环位于该工作者的DoWork事件处理程序中。

我希望以上信息足以让你识别代码中的错误并进行修复。如果没有,请提供一个好的代码示例,以便对其进行修改,以说明我的意思。

相关文章:
  • 没有找到相关文章