繁体   English   中英

使所有类事件在与构造函数调用线程相同的线程上触发

[英]Make all class events fired on the same thread as the constructor calling thread

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

该类在不同的线程中触发事件,因此我需要以接收事件的形式在函数中执行Control.InvokeRequiredControl.Invoke()代码。

是否有可能使所有线程处理都发生在类上,所以我不需要以表单的形式执行Invoke()并假设所有即将发生的事件已经在同一线程上?

我正在考虑的解决方案(我不喜欢)是在类的构造函数中启动虚拟控件,或将引用传递给类中的表单,然后检查InvokeRequired

还有其他解决方案吗?

通常,一类不应涉及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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM