提问者:小点点

在C#WPF中使用按钮事件时的流程流


我刚刚开始使用C#WPF表单,遇到了一个小问题,我找不到解决方法。

我有一个按钮,目前只是检查一个文件夹是否存在。

正确的流程是;

  1. 写入文本框以表示进程已启动。
  2. 执行该过程。
  3. 写入文本框以表示进程已完成(是否成功)

实际发生的情况是,当按下按钮时,所有操作都完成了,然后写入textbox。

有没有一种方法让文本框在每个过程结束时填充--计划是在一个按钮上执行多个操作,最终按下并记录每一个操作--最后的过程可能需要30多分钟,因此需要在过程工作时保持用户更新?

    private void Button_Check_Click(object sender, EventArgs e)
        {  
            textbox_OutputBox.Text = textbox_OutputBox.Text.Insert(0, DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss") + " : " + "Folder check started" + Environment.NewLine);
            
                if (!Directory.Exists("C:\\Windows"))
                {
                    textbox_OutputBox.Text = textbox_OutputBox.Text.Insert(0, DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss") + " : " + "Folder missing" + Environment.NewLine);
                }
                else
                {
                    textbox_OutputBox.Text = textbox_OutputBox.Text.Insert(0, DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss") + " : " + "folder not missing" + Environment.NewLine);
                }
            
        }

希望这一切都是有意义的,但如果不是,请让我知道。多谢了。


共1个答案

匿名用户

如果处理需要很长时间,您可能希望在后台线程上运行它,以避免阻塞UI。报告进度的一种方法是采用处理方法更新的参数和定期更新主线程上UI的计时器。例如:

public void MyProcess(ConcurrentQueue<string> processedItems, CancellationToken cancel){
    foreach(var item in items){
        cancel.ThrowIfCancellationRequested();
        // do processing
        processedItems.Add(item.ToString());
     }
 }

添加一个取消相应cancellationTokenSource的按钮,以及一个使用processedItems集合中的所有行每秒左右更新textbox的计时器。使用task.run在后台线程上运行该方法,并记住在try块中等待任务以捕获任何异常,以便能够处理它们。