【发布时间】:2011-04-25 11:19:06
【问题描述】:
我正在一个单独的线程中打开一个新窗口。我希望窗口打开并自动运行作业,然后将其进度报告到此窗口(我将使用进度条)。
打开窗口的动作代码:
private void button_Run_Click(object sender, RoutedEventArgs e)
{
ExecutorWindow myExecWindow = new ExecutorWindow();
myExecWindow.Show();
}
窗口代码:
public partial class ExecutorWindow : Window
{
BackgroundWorker execBackground = new BackgroundWorker();
public ExecutorWindow()
{
InitializeComponent();
RunExecutor();
}
public void RunExecutor()
{
// CREATE BACKGROUNDWORKER FOR EXECUTOR
execBackground.DoWork += new DoWorkEventHandler(execBackground_DoWork);
execBackground.RunWorkerCompleted += new RunWorkerCompletedEventHandler(execBackground_RunWorkerCompleted);
execBackground.WorkerReportsProgress = true;
execBackground.WorkerSupportsCancellation = true;
// RUN BACKGROUNDWORKER
execBackground.RunWorkerAsync();
}
private void execBackground_DoWork(object sender, DoWorkEventArgs e)
{
// CREATE EXECUTOR INSTANCE
Executor myExecutor = new Executor(arg1, arg2);
myExecutor.RunWhileRemainMachines();
}
private void execBackground_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("RunWorkerCompleted execBackground");
}
}
但是发生的情况是 RunProcessingJob 仅在我关闭窗口时被调用(这是正常的,因为我在 ShowDialog 之后运行它)。我试图从公共 ExecutorWindow() 函数中调用它,但结果恰恰相反:窗口仅在 RunProcessingJob 完成时打开。
我不知道如何订购.. 我想要的行为是: - 点击按钮 - 打开窗户 - 运行处理作业(无需用户进一步交互) - 运行时更新窗口
我应该在 public ExecutorWindow() 中调用的 BackgroundWorker 中运行我的处理作业吗?
这个处理工作已经在大量使用 BackgroundWorkers,我不确定这是一种优雅的方式。..
编辑:我已经根据您的 cmets 更新了我的代码(直接运行我的窗口而不创建另一个线程。另外,我从窗口构造函数运行我的处理作业,但现在在一个单独的线程中以防止我遇到的阻塞问题) .
【问题讨论】:
标签: c# wpf multithreading progress-bar