C#在BackgroundWorker后执行一些操作RunWorker完成完成

问题描述:

我有一个C#项目(.NET 3.5),它使用BackgroundWorker来做一些事情。 这东西为它执行的所有操作写一个日志文件。当完成BackgroundWorker 时,我需要检索日志文件中的一些信息。问题是 当RunWorkerCompleted事件被触发时,日志文件仍然是空的。所以,如果我做到以下几点:C#在BackgroundWorker后执行一些操作RunWorker完成完成

private void BackProgress_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
     LoadLog(); 

} 

LoadLog方法,会发现一个空的日志。

我一直在调试应用程序,我发现日志文件在RunWorkerCompleted最后一个花括号被击中的时刻不再是空的。我不知道如何在适当的时候加载日志文件,因为在RunWorkerAsync()调用之后我立即执行的任何操作都会立即执行,并且BackgroundWorker的工作仍然无法完成(再次为空日志)。

基本上我需要能够在RunWorkerCompleted方法达到其结束后调用LoadLog

你有什么想法可以帮助我解决这个问题吗?

感谢提前:)

+0

你能向我们展示了'DoWork'处理程序是什么样子? – Caramiriel 2013-03-12 21:32:56

+3

这几乎听起来像是一个日志刷新问题,也许看看你正在使用的任何日志系统,看看是否有刷新调用或自动刷新或什么。 – WildCrustacean 2013-03-12 21:33:22

+0

您可以将代码放入工作线程中,您可以使用true/false标志来指示工作线程何时完成。如果您仍然拥有该线程的句柄,则可以在尝试读取之前检查该线程是否处于活动状态。如果文件已打开,那么它将被锁定,您也可以检查该文件。 – Sorceri 2013-03-12 21:33:32

你可以尝试控制/表BeginInvoke方法异步调用LoadLog。

该方法使用PostMessage在Windows消息队列中放置注册消息并立即返回 - 这就是它如何进行异步调用。

像这样:

BeginInvoke(new MethodInvoker(LoadLog)); 
+0

这是我第二次做这件事的作品。问题是,它应该从第一次开始工作(没有人想发送重复的电子邮件)。在添加此代码之前,第一次未加载日志,然后加载第二个日志,第三个日志未加载,依此类推。现在它每次从第二个开始加载。不过,重要的是第一个。 :/ – 2013-03-12 21:53:50

+0

第一次发生什么?日志是否为空?第一次运行后,日志何时不为空?对不起,我试图理解这个问题。 – 2013-03-12 22:55:07

+0

没关系。第一次日志是空的,因为(据我所知)在bw完成之前调用LoadLog方法。当runworkercomplete中的最后一个大括号被传递时,日志停止为空。 – 2013-03-12 23:09:29