简而言之,由于业务需求的变化,我需要能够向最终用户展示由C#控制台应用程序控制的文件存档过程的进度。控制台应用程序基本上从数据库中获取本地文件列表,然后将它们复制到存档位置。这最初应该是由计划任务触发的后台进程。但是,现在,用户可以使用命令行中的各种参数手动启动它,因此我最近的任务是让用户知道归档过程的状态。
我认为我只会使用WPF ProgressBar控件,但现在我正在试图找出最好的方法来解决这个问题。我一直在使用@JamesWilkins的答案:WPF window from a Console project?
我已将ProgressBar窗口添加到控制台应用程序,并将以下内容添加到控制台中的Main方法(为简化起见,已超简化):
[STAThread]
static void Main(string[] args)
{
// EXISTING CONSOLE LOGIC
ParseCommandLineArgs();
Configure();
// ADDED
InitializeWindows(); // opens the WPF window and waits here
// EXISTING CONSOLE LOGIC
BeginArchival();
}
static void InitializeWindows()
{
WinApp = new Application();
WinApp.Run(ProgressBar = new ProgressBar()); // blocking call
}
然后在ProgressBar.xaml代码后面:
public partial class ProgressBar : Window
{
public ProgressBar()
{
InitializeComponent();
}
private void ProgressBar_OnContentRendered(object sender, EventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += worker_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
worker.RunWorkerAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
// foreach file that is archived, report progress to the
// ProgressBar.
for (int i = 0; i < 100; i++)
{
(sender as BackgroundWorker).ReportProgress(i);
}
}
private void worker_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
PbArchiveStatus.Value = e.ProgressPercentage;
}
}
进程在InitializeWindows()方法等待,直到进度条关闭,因此它不会触及我需要进度条显示进度的任何存档逻辑。看来我基本上需要将所有现有的控制台逻辑放在ProgressBar.worker_DoWork()方法中,但此时我的大脑开始受到伤害,所以我想我会伸手去拿。
我是在正确的轨道上,还是有更好的方法将基于GUI的进度条添加到控制台实用程序?让我知道我是否可以澄清任何事情。