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
。
你有什么想法可以帮助我解决这个问题吗?
感谢提前:)
你可以尝试控制/表BeginInvoke方法异步调用LoadLog。
该方法使用PostMessage在Windows消息队列中放置注册消息并立即返回 - 这就是它如何进行异步调用。
像这样:
BeginInvoke(new MethodInvoker(LoadLog));
这是我第二次做这件事的作品。问题是,它应该从第一次开始工作(没有人想发送重复的电子邮件)。在添加此代码之前,第一次未加载日志,然后加载第二个日志,第三个日志未加载,依此类推。现在它每次从第二个开始加载。不过,重要的是第一个。 :/ – 2013-03-12 21:53:50
第一次发生什么?日志是否为空?第一次运行后,日志何时不为空?对不起,我试图理解这个问题。 – 2013-03-12 22:55:07
没关系。第一次日志是空的,因为(据我所知)在bw完成之前调用LoadLog方法。当runworkercomplete中的最后一个大括号被传递时,日志停止为空。 – 2013-03-12 23:09:29
你能向我们展示了'DoWork'处理程序是什么样子? – Caramiriel 2013-03-12 21:32:56
这几乎听起来像是一个日志刷新问题,也许看看你正在使用的任何日志系统,看看是否有刷新调用或自动刷新或什么。 – WildCrustacean 2013-03-12 21:33:22
您可以将代码放入工作线程中,您可以使用true/false标志来指示工作线程何时完成。如果您仍然拥有该线程的句柄,则可以在尝试读取之前检查该线程是否处于活动状态。如果文件已打开,那么它将被锁定,您也可以检查该文件。 – Sorceri 2013-03-12 21:33:32