C#WPF在创建窗口时运行操作

时间:2011-04-25 11:19:07

标签: c# wpf multithreading progress-bar

我在一个单独的线程中打开一个新窗口。我希望窗口打开并自动运行作业,然后将其进度报告给此窗口(我将使用进度条)。

打开窗口的操作代码:

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,我不确定这是一个优雅的方式..

编辑:我已根据您的评论更新了我的代码(直接运行我的窗口而不创建另一个线程。另外我从窗口构造函数运行我的处理作业,但现在在一个单独的线程中以防止我遇到的阻塞问题)

3 个答案:

答案 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())