【发布时间】:2015-06-25 20:52:11
【问题描述】:
我有一个 Sub 每次调用它都会使 backgroundworker 变暗。后台工作人员的 dowork 函数通过包含在连接到服务器的 dll 中的套接字连接代码调用数据。然后,来自服务器的返回被包装在套接字 dll 引发的事件中,并且主 UI 线程上的一个名为 RequestResult(见下文)的事件处理程序进行侦听。当我反复调用带有 backgroundworker 的 sub 时,我从在 RequestResult 上获得一个事件响应触发到多个事件,如下所示:
调用 #1:返回 1 个事件
调用 #2:返回 2 个事件
....
调用 #N:返回 N 个事件
重要的是要注意,在将 backgroundworker 添加到 sub 之前,我没有这种行为。
这是我正在做的简化代码:
Public Sub RequestData(ByVal args As object)
Dim bw As BackgroundWorker = New BackgroundWorker
AddHandler bw.DoWork, AddressOf bw_DoWork
bw.RunWorkerAsync(args)
End Sub
Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
Dim args As SocketArgs = e.Argument
RequestServerData(args) 'This calls server thru socket connection dll
End Sub
然后在某个时间点从服务器接收数据并包装在主 UI 线程上的控件侦听的事件中:
'Event handler on the UI thread for event containing serverdata. It fires N times.
Private Sub RequestResult(e As SocketsArgs)
If Not Me.CheckAccess Then
Dispatcher.Invoke(Sub() Me.RequestResult(e))
Exit Sub
End If
'Do stuff with data
End Sub
我觉得我缺少有关 BackGroundWorker 的一些基本知识,即它如何从根本上与线程池一起工作。我不应该每次都重新调整它(即它是一个类级别的变量)吗?它是为每个对 dowork 的调用生成一个线程,还是将它们全部堆叠在一个线程上?我是否需要处理 backgroundworker 以防止触发多个事件?
【问题讨论】:
-
您能告诉我们(编辑您的帖子)
Sub RequestResult在哪里注册为事件处理程序吗?还有,相关事件是在哪里引发的? -
已编辑。 Sub RequestResult 位于 UI 线程上,位于主窗口的代码隐藏中。该事件由 RequestServerData 调用的类中包含的 dll 引发。
-
对不起,但这并没有回答我的问题。我想查看将
RequestResult注册为事件处理程序的实际代码。我想查看AddHandler调用和调用它的上下文。我还想查看您的套接字 dll 引发事件的代码,该事件导致对RequestResult的调用(或在本例中为多个调用)。实际上,最好在您的帖子中发布a Minimal, Complete, and Verifiable example,我们可以自己运行以重现您的问题。如果你能做到这一点,你几乎可以保证得到一个好的答案。
标签: vb.net multithreading events event-handling backgroundworker