Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BackgroundWorker和删除大型文件_C#_Asynchronous_Backgroundworker - Fatal编程技术网

C# BackgroundWorker和删除大型文件

C# BackgroundWorker和删除大型文件,c#,asynchronous,backgroundworker,C#,Asynchronous,Backgroundworker,编写一个应用程序的一部分,用来清理任何旧文件,但其中一些文件相当大,因此我启动了一些后台人员来完成大部分工作。 我的问题是,如果我正在调用BackgroundWorker上的FileInfo对象上的file.Delete调用,并且应用程序退出: 该文件将发生什么情况,是否将以无效状态挂起 应用程序将挂起,还是BGWorker将保持活动状态 这个文件是无效的吗 BackgroundWorker是本例中使用的正确类吗 好的,为了解决这个问题,我已经切换到使用Thread对象。 这将创建一个前台线程

编写一个应用程序的一部分,用来清理任何旧文件,但其中一些文件相当大,因此我启动了一些后台人员来完成大部分工作。 我的问题是,如果我正在调用BackgroundWorker上的FileInfo对象上的file.Delete调用,并且应用程序退出:

  • 该文件将发生什么情况,是否将以无效状态挂起
  • 应用程序将挂起,还是BGWorker将保持活动状态
  • 这个文件是无效的吗
  • BackgroundWorker是本例中使用的正确类吗

好的,为了解决这个问题,我已经切换到使用Thread对象。 这将创建一个前台线程,在所有前台线程完成之前,应用程序不应该退出


很抱歉给您带来麻烦。

如果您只想让应用程序线程等待文件被删除,您可以将BackgroundWorker与AutoResetEvent结合使用。这一点在 (请注意,此答案还包含有关取消的其他信息)

这样,您仍然具有由BackgroundWorker公开事件的优点,例如ProgressChanged和RunWorkerCompleted


当然,创建前置线程是另一个可行的工作,因为它们会阻塞主线程直到退出。但这可能不是最优雅的解决方案

我认为后台工作人员是这种操作的正确选择。我可能无法回答您所有的问题,但这里有一些答案:没有应用程序不会因为后台工作程序运行不同的线程而挂起。一旦后台工作人员开始处理文件,我认为它可能会进入无效状态。如果您考虑过使用任务并行库,它基本上也可以做同样的事情,但要简单得多。如果您担心应用程序会意外退出,并且这些文件确实很大,您可以创建一个公开删除队列的windows服务。这实际上是您的backgroundWorker包装。如果你想删除一个文件,为什么要担心它是否会无效?或者你只是想确保它真的被删除了?只是想确保它真的消失了。我并不担心它会意外退出,但应用程序用户可能会选择退出应用程序,而不知道有文件正在被删除。我希望它尽可能透明。