【问题标题】:Stop a method and wait for user input停止方法并等待用户输入
【发布时间】:2015-11-14 17:44:58
【问题描述】:

我的程序是用 C# 编写的,并且在 WPF 中有一个 GUI。单击一个按钮时,将调用方法StopAndGo()

问题是我希望这个方法在某些点停止,等待用户输入,然后继续。

我想这可以通过多线程来完成,但由于我从未研究过该主题,因此我想在研究之前确定它是否可以完成,以及是否难以完成。

你能给我一些关于需要做什么的指导吗?

谢谢。

【问题讨论】:

  • 当 StopAndGo() 等待用户输入时,是否会显示某种提示?
  • StopAndGo() 正在等待 GUI 中的按钮被点击。

标签: c# wpf multithreading wpf-4.0


【解决方案1】:

首先,我不认为多线程是要走的路。如果您希望该方法在某些点停止,您应该对其进行编码以显示弹出框、文本框或任何其他区域以接收输入。因此,您将需要多个方法来处理此问题,并且在 main 方法中您可以调用其他方法来创建这些等待点。

【讨论】:

  • 对,如果您可以显示某种对话框(输入框、提示您需要的数据的自定义对话框等),则无需进入线程。如果是对话框,那么您可以创建表单,在表单上调用 ShowDialog 并处理 ShowDialog 的结果(DialogResult.OK、Cancel、Yes、No 等,具体取决于您的表单)
  • 它被称为“向导”。其中许多在 Visual Studio 中。例如项目 + 添加新项目 + 报告向导。
  • @Hans 这似乎是一个家庭作业问题,因此我提供了指导。
  • 问题是 StopAndGo() 在一个应该独立于 GUI 类的类中。 GUI 是创建包含 StopAndGo() 方法的类的那个。所以 StopAndGo() 无法创建任何窗口。
  • 除非我遗漏了什么,否则您可以更改 StopAndGo 来做任何您想做的事情。但是,我说的是多方法。
【解决方案2】:
【解决方案3】:

使用 ManualResetEvent 类。启动一个执行 StopAndGo() 的线程;在该线程调用的上下文中

 this.manualResetEvent.WaitOne(TimeSpan.Infinite,false);

当你的用户完成输入后,调用

this.manualResetEvent.Set();

这会让其他线程知道继续 stopANDgo

【讨论】:

  • 你不想要 WaitOne(0, false)。如果你在超时为零的情况下执行 WaitOne,它会立即返回并告诉你是否设置了句柄,它不会阻塞。
【解决方案4】:

当您的方法具有后台性质并且您不想在该方法执行时锁定 UI 时使用多线程的原因。

对于等待场景,您可能需要使用同步对象,例如 ManualResetEvent

【讨论】:

    【解决方案5】:

    如果您的代码在没有用户输入的情况下无法继续,模式对话框是避免多线程的好方法。

    DialogBox dialogBox = new DialogBox();
    
    // Show window modally 
    // NOTE: Returns only when window is closed
    Nullable<bool> dialogResult = dialogBox.ShowDialog();
    

    来自https://msdn.microsoft.com/en-us/library/system.windows.window.showdialog(v=vs.110).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-24
      • 2015-11-30
      • 2012-07-22
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多