【问题标题】:Backgroundworker wait for user to fill in a filed in the GUIBackgroundworker 等待用户在 GUI 中填写字段
【发布时间】:2013-05-16 21:15:19
【问题描述】:

我有一个后台工作人员,它应该做两件事。
1.在GUI中添加用户控件
2.读取用户在 sed usercontrol 中输入的值并将其传递给函数
做这个的最好方式是什么?

我正在考虑使用 2 种事件处理方法来传递给 DoWork 事件。
第一个处理点号 1,第二个处理点号 2。
然后我会这样做:
1. 在worker.ProgressChanged 事件中——worker 将用户控件添加到页面
2. 在 worker.ProgressChanged 事件中 - 在 while 循环中,worker 等待填写所需的 ui 值
3.在worker.RunWorkerCompleted事件内部——告诉worker执行第2个任务。

这是正确的方法吗?
如果不是,最好的方法是什么?
如果这是正确的方法,那么工人等待价值的最佳方式是什么? 只是一个内部睡眠的while循环还是有更复杂的方法?
先感谢您。

编辑 1:我正在使用 WPF - XAML,如果这有什么不同的话

【问题讨论】:

  • 你应该告诉我们你真正想做什么,而不是你认为你应该怎么做。
  • 为什么不使用两个BackgroundWorker,或者完全切换到Task/Rx? BackgroundWorker 仅适用于最简单的场景,Microsoft 确实为复杂的场景提供了更强大的库。
  • 为什么要在后台worker中添加控件?

标签: c# wpf backgroundworker


【解决方案1】:

我不认为让你的后台工作线程循环等待用户输入是一个好主意。 UI 已经这样做了,你应该使用它。

在我看来,你应该这样做:

  1. 向 backgroundworkers DoWork 事件添加一个事件处理程序,它将调用您在 (2.) 中提到的函数
  2. 向控件添加一个事件处理程序,当用户输入内容时该处理程序将执行。如果您的控件有一个TextBox,那么您应该向TextChanged 事件添加一个事件处理程序。
  3. 在上面的事件处理程序中,调用worker.RunWorkerAsync(textBox.Text)

这样处理函数 (2.) 将仅在需要时调用,您不会浪费资源在两个线程上等待用户输入。

【讨论】:

  • 所以基本上你是在告诉我,我必须为每个操作使用一个工人?(总共 2 个工人)
  • @Para,如果您所说的操作是指仅调用处理用户输入的函数,并且如果您对每个用户控件有不同的处理函数,那么是的,您应该为每个操作使用一个工作人员。但是,如果每个控件的处理功能都相同,那么您只需要一个工人。
【解决方案2】:

这就是我最后的方式:

while(string.IsNullOrEmpty(_emailData.CaptchaCurrent))
    Thread.Sleep(100);

创建一个变量来存储用户输入并让线程等待该特定变量具有值。

这一切都在一个线程中进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多