【问题标题】:Make all class events fired on the same thread as the constructor calling thread使所有类事件在与构造函数调用线程相同的线程上触发
【发布时间】:2013-02-23 01:41:36
【问题描述】:

我有一个 windows 窗体应用程序和一个类。

该类在不同的线程中触发事件,因此我需要在接收事件的表单中的函数中编写Control.InvokeRequiredControl.Invoke()的代码。

是否有可能让所有线程处理都发生在类上,这样我就不需要在表单中做Invoke(),并假设所有即将发生的事件都已经在同一个线程上?

我正在考虑但我不喜欢的解决方案是在类的构造函数中启动一个虚拟控件,或者在类中传递对表单的引用,并检查InvokeRequired 是否。

还有其他可能的解决方案吗?

【问题讨论】:

  • "我正在考虑的解决方案,我不喜欢,是在类的构造函数中启动一个虚拟控件,或者在类中传递对表单的引用,并检查InvokeRequired 反对。” 同意,我也不喜欢这样,而且我不明白为什么会考虑它。检查InvokeRequired 或总是使用Invoke 有什么问题?为什么这是一个你觉得需要“解决”的“问题”?
  • 默认情况下,一切都应该在 UI 线程上运行,除非您显式创建新线程、任务或在线程池中将项目排队。你能用最少的代码来证明这一点吗?
  • @EdS。我想将所有代码包装在类文件中,并将实现尽可能干净地留在表单中。就像处理普通 windows.forms 事件的方式一样。
  • @Despertar Thread t = new Thread(()=>{ raiseEvent(); }); t.Start();
  • 也许你可以利用一些面向方面的编程。我在这里发布了一个关于在 UI/主线程上执行方法调用的答案:stackoverflow.com/questions/11183026/… 也许你也可以申请这个?如果您将 UI 更改委托给带有特殊属性的方法,也许可以这样简化使用?

标签: c# .net vb.net multithreading invoke


【解决方案1】:

一般来说,一个类不应涉及 UI 实现细节。它很可能用于在另一个线程上引发事件无关紧要的场景。在这种情况下,您当然不想编组。你也不知道要编组到什么。

在 Winforms 中通过 ISynchronizeInvoke 接口解耦是一种很好的方法,FileSystemWatcher.SynchronizingObject 就是一个很好的例子。该属性允许应用程序选择是自行处理编组还是留给 FSW 来完成。在一个带有 Foo 事件(VS2010 语法)的示例类中,你使它看起来像这样:

Imports System.ComponentModel

Public Class Example
    Public Event Foo As EventHandler

    Public Property SynchronizingObject As ISynchronizeInvoke

    Protected Sub OnFoo(e As EventArgs)
        If SynchronizingObject IsNot Nothing AndAlso SynchronizingObject.InvokeRequired Then
            SynchronizingObject.BeginInvoke(Sub() RaiseEvent Foo(Me, e), Nothing)
        Else
            RaiseEvent Foo(Me, e)
        End If
    End Sub
End Class

Form 类现在可以简单地将自己分配给 SynchronizingObject 属性,如下所示:

Public Class Form1
    Private WithEvents obj As Example

    Public Sub New()
        InitializeComponent()
        obj.SynchronizingObject = Me
    End Sub

    Private Sub obj_Foo(sender As Object, e As EventArgs) Handles obj.Foo
        '' No marshaling required
        ''...
    End Sub
End Class

【讨论】:

    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多