【问题标题】:Start tab for new thread, and close tab and end thread新线程的开始选项卡,关闭选项卡和结束线程
【发布时间】:2011-11-11 06:40:50
【问题描述】:

我按照http://www.dotnetspark.com/kb/1867-create-tab-control-wpf.aspx 上的教程为 WPF 应用程序创建可关闭的选项卡。

我正在创建一个多线程应用程序,我将使用上面链接中的可关闭选项卡。我希望每个线程都有自己的选项卡并在运行时对其进行更新。我应该在新线程中创建选项卡还是在主线程中创建选项卡并从新线程更新它?这样做的正确方法是什么?

标签关闭时如何使线程结束?

问候!

【问题讨论】:

    标签: c# wpf multithreading tabs


    【解决方案1】:

    两者都没有。让主线程创建选项卡,在各个其他线程的指示下更新选项卡,并在选项卡关闭时命令线程终止。

    了解如何use the dispatcher 来协调线程。

    如果一个线程做了一些按程序逻辑不应该在那个时候完成的工作,那么这个线程的代码就会被破坏。修理它。如果关闭选项卡时线程不应该继续运行,则将其编码为在选项卡关闭时不继续运行。当程序逻辑不应该完成工作时,不要让线程中断,编码完成工作,然后尝试在其他地方修复它。

    这是一种反向思考线程的方式。线程只是工作的工具。你通过控制工作来控制他们。您编写线程执行的每一行代码。如果您不希望线程在条件 Y 中执行 X,请将其编码为在条件 Y 中不执行 X。

    总之,如果程序逻辑说当标签 Y 关闭时不应该完成工作 X,请执行以下操作:

    1) 在某处,存储一个标志,指示工作 X 是否应该完成。

    2) 在 X 工作的代码中,检查这个标志。如果它设置为 no,请不要执行此操作。按照程序逻辑,这项工作不应该完成。这样做是破碎

    3) 当标签页关闭时,让 UI 线程设置标志停止工作 X。

    选项卡不应对应线程。这没有逻辑意义。选项卡应与选项卡中显示的内容相对应。 (它们可能“恰好”间接对应于线程,但这不是主要的。线程实际上对应于与选项卡关联的任何工作。)

    原则上,如果不同的线程接管了相同的工作,它不应该还在同一个标​​签中吗?或者是否应该仅仅因为不同的线程正在生成相同的数据而突然进入不同的选项卡?您碰巧总是在同一个线程中执行该选项卡中的工作,这是一个实现细节,应该以这种方式反映在架构中。正如您所了解的,这只会造成愚蠢,当您真的不在乎时,您必须弄清楚哪个线程正在执行工作。

    【讨论】:

    • 这就是我所困的地方:假设我创建了 7 个线程来打开 7 个选项卡,当我关闭其中一个选项卡时,它必须知道哪个线程属于该选项卡,这样我才能中止它。最好的方法是什么?
    • @Ayra 您不想为每个线程创建一个选项卡,因为 WPF 不允许线程更改在其他线程上创建的对象。相反,您希望在某个长时间运行的进程期间创建一个线程,该进程在进程完成时自动结束。您还可以创建一个从TabItem 继承的控件,该控件将在构造函数中启动一个线程,并在 TabItem 被释放时结束该线程。不过我不推荐这条路线。
    • @Arya:它不必知道哪个线程属于该选项卡,因为它不关心哪个线程被停止。当它正在做的工作完成时终止是线程的工作。 UI 线程应该简单地指示与该选项卡关联的作业已完成,并且该选项卡线程不应在其作业完成后继续运行。 (你正在编写所有代码,所以让它一起工作。)
    • @David Schwartz 线程的工作永远不会结束。这是一个网络应用程序,我希望它 24/7 全天候运行并使用选项卡编写更新。创建 ClosableTab 时是否可以将线程名称传递给它并通过 RoutedEventArgs 返回名称?
    • @Arya:关闭选项卡时线程的工作结束。你不想对线程做任何事情,你想对线程正在做的工作做一些事情,具体来说,表明它已经完成了。然后任何试图在它上面工作的线程都会注意到没有更多的工作要做并终止自己(或做其他事情)。你正在以一种倒退的方式思考这个问题。想想那些不再需要做的工作。线程只是工作的工具。工作决定了线程做什么。他们完成需要完成的工作,并在不再需要完成的工作时停止。
    【解决方案2】:

    您必须使用 UI 线程来呈现/显示选项卡。请参阅this link(archive)。正如标题所说的“使用 Dispatcher 构建更具响应性的应用程序”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2012-07-30
      • 1970-01-01
      相关资源
      最近更新 更多