C# 向父UI线程报告进度

C# 向父UI线程报告进度,c#,multithreading,user-interface,progress,C#,Multithreading,User Interface,Progress,抱歉,如果我没有解释清楚,但我正在编写一个应用程序,它给我带来了一些线程问题 我有一个启动System.Timers.Timer的UI。每次计时器超时,它都会触发一个工作流,打开一个进度屏幕。为了防止在最后一个工作流完成之前启动另一个工作流,它会在主窗体上锁定一个对象。 此进度屏幕启动并报告使用FileCopyEX复制某些文件的进度 我遇到的问题是,进度屏幕直到工作流程完成后才会显示 希望这能让事情变得更清楚: 主要形式 | 计时器超时 | 工作流启动 | 进度屏幕打开(发生的错误返回到上一个)

抱歉,如果我没有解释清楚,但我正在编写一个应用程序,它给我带来了一些线程问题

我有一个启动System.Timers.Timer的UI。每次计时器超时,它都会触发一个工作流,打开一个进度屏幕。为了防止在最后一个工作流完成之前启动另一个工作流,它会在主窗体上锁定一个对象。 此进度屏幕启动并报告使用FileCopyEX复制某些文件的进度

我遇到的问题是,进度屏幕直到工作流程完成后才会显示

希望这能让事情变得更清楚:

主要形式 | 计时器超时 | 工作流启动 | 进度屏幕打开(发生的错误返回到上一个) | 发生文件复制(进度报告回进度屏幕) 如果没有错误,在下一次勾选之前返回主屏幕

到目前为止,我只实现了非常简单的线程,所以我不确定如何最好地实现它。我曾尝试在BackGroundWorker上启动工作流,以将其与UI线程分离,但其行为相同


谢谢没有代码,我只能猜测原因,但可能的原因是进度窗口需要UI泵送消息才能显示,即UI线程需要运行

如果UI线程正忙于运行您的工作流,那么在这之后它才会开始处理窗口的显示。您需要分离流程,以便进度窗口位于UI线程上,工作流位于后台线程上


希望这有意义

我建议你读一读关于幕后工作者的书。这有一个报告进度的钩子


请记住,系统计时器在非UI线程上调用其事件处理程序。无论何时,当您使用UI执行某些操作时,您必须在UI线程上。

您的问题始于System.Timers.Timer,在另一个线程上运行。之后就变得很不清楚了。关注后台工作人员。