【问题标题】:C# WPF Run action when window has been createdC# WPF 在创建窗口时运行操作
【发布时间】: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


    【解决方案1】:

    这完全取决于Executor.RunProcessingJob 做了什么;不看代码就无法回答这个问题。

    但是,您为什么要在另一个线程上创建 ExecutorWindow?如果您希望它保持对用户输入的响应,您别无选择,只能在另一个线程上执行您的处理(您提到BackgroundWorker,所以这可能已经发生了)。但如果你这样做,首先就不需要在自己的线程上创建ExecutorWindow

    【讨论】:

    • 嗨,Jon,RunProcessingJob 正在创建几个执行某些网络操作的 BackgroundWorker(执行延迟可以从 60 秒到 5 分钟不等)。它一次运行 X 个 BackgroundWorker(X 之前定义过),并等待一个 BackgroundWorker 完成,然后再运行另一个。一旦他们都跑了,它就会返回。理想情况下,我希望每次其中一个 BackgroundWorkers 完成或报告进度时更新我的​​ ExecutorWindow 中的进度条。
    【解决方案2】:

    我认为您应该在 ExecutorWindow 类中启动处理线程。例如,将它连接到某个事件,加载。此外,我认为您不需要单独的线程来创建和显示您的 ExecutorWindow。 (如果您不想要模态对话框,只需调用 Show() 而不是 ShowDialog())

    【讨论】:

      【解决方案3】:

      覆盖 ExecutorWindow 的 OnInitialize 方法

      protected override void OnInitialized(EventArgs e)
          {
              base.OnInitialized(e);
              RunExecutor();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        相关资源
        最近更新 更多