我在一个单独的线程中打开一个新窗口。我希望窗口打开并自动运行作业,然后将其进度报告给此窗口(我将使用进度条)。
打开窗口的操作代码:
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完成时窗口才会打开。
我不知道如何订购...我想要的行为是: - 单击按钮 - 打开窗户 - 运行处理作业(无需用户进一步交互) - 运行时更新窗口
我应该在公共ExecutorWindow()中调用的BackgroundWorker中运行我的处理作业吗?
这个处理工作已经集中使用了BackgroundWorkers,我不确定这是一个优雅的方式..
编辑:我已根据您的评论更新了我的代码(直接运行我的窗口而不创建另一个线程。另外我从窗口构造函数运行我的处理作业,但现在在一个单独的线程中以防止我遇到的阻塞问题)答案 0 :(得分:1)
这完全取决于Executor.RunProcessingJob
的作用;如果不查看该代码,就无法回答这个问题。
但是,为什么要在另一个线程上创建ExecutorWindow
?如果您希望它保持对用户输入的响应,除了在另一个线程上执行处理之外别无选择(您提到BackgroundWorker
,因此这可能已经发生)。但是如果你这样做,就不需要首先在自己的线程上创建ExecutorWindow
。
答案 1 :(得分:0)
覆盖ExecutorWindow
的OnInitialize方法
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
RunExecutor();
}
答案 2 :(得分:0)
我认为你应该在ExecutorWindow类中启动你的处理线程。例如,将它挂钩到某个事件,Load。另外我认为你不需要一个单独的线程来创建&显示你的ExecutorWindow。 (如果您不想要模态对话框,只需调用Show()而不是ShowDialog())