Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 是否应在新线程中引发事件以不阻止当前工作?_.net_Vb.net_Multithreading_Events - Fatal编程技术网

.net 是否应在新线程中引发事件以不阻止当前工作?

.net 是否应在新线程中引发事件以不阻止当前工作?,.net,vb.net,multithreading,events,.net,Vb.net,Multithreading,Events,我目前正在设计一个将由第三方使用的程序集。其中一个类有一个很长的TCP连接进程,它使用事件通知其进程。比如说 ''# Do stuff that takes some time RaiseEvent CompletedFirstPartEvent() ''# Do stuff that takes some time RaiseEvent CompletedSecondPartEvent() ''# Do stuff that takes some time RaiseEvent Complet

我目前正在设计一个将由第三方使用的程序集。其中一个类有一个很长的TCP连接进程,它使用事件通知其进程。比如说

''# Do stuff that takes some time
RaiseEvent CompletedFirstPartEvent()
''# Do stuff that takes some time
RaiseEvent CompletedSecondPartEvent()
''# Do stuff that takes some time
RaiseEvent CompletedSecondPartEvent()
我所看到的是,如果其中一个事件的处理程序花费的时间太长(甚至更糟,它会阻塞),我可能会超时,开发人员很难看到一个类不能正常工作,因为他的处理程序花费的时间太长

我本来打算在一个新线程中触发事件以避免这个问题,但这对我来说很奇怪,因为我从来没有见过这样的事情,直到现在我看到的是,如果开发人员的处理程序将非常耗时,那么开发人员将生成一个新线程。因此,问题是:

你会怎么做?创建新线程还是强制用户创建自己的线程?(或者——我不知道有没有更好的方法?)


提前感谢。

为什么不使用backgroundworker?

为什么不使用backgroundworker?

我们在构建时遇到了同样的问题-如何在不牺牲应用程序的情况下允许用户代码中长时间运行流程

我们决定给用户一个选项(我们的设置与您的不同,但前提应该是可行的)。基本上,允许用户告诉您是否在新线程上派生事件

这样,如果开发人员知道他们有快速的操作,他们可以避免每个事件的新线程开销,还可以确保事件将以特定的顺序运行(否则,由于所有事件都在不同的线程上触发,他们很容易在自己的代码中出现线程问题),但是,如果他们有可能阻塞的进程,他们可以指定需要额外的开销,并且可以自己处理任何潜在的线程问题


在这个场景中,您只需观察一个标志,然后根据需要决定同步触发事件或在线程上触发事件。两全其美(尽管在您这方面有点复杂)。

我们在构建时遇到了相同的问题-如何在不牺牲应用程序的情况下允许用户代码中的长时间运行进程

我们决定给用户一个选项(我们的设置与您的不同,但前提应该是可行的)。基本上,允许用户告诉您是否在新线程上派生事件

这样,如果开发人员知道他们有快速的操作,他们可以避免每个事件的新线程开销,还可以确保事件将以特定的顺序运行(否则,由于所有事件都在不同的线程上触发,他们很容易在自己的代码中出现线程问题),但是,如果他们有可能阻塞的进程,他们可以指定需要额外的开销,并且可以自己处理任何潜在的线程问题


在这个场景中,您只需观察一个标志,然后根据需要决定同步触发事件或在线程上触发事件。两全其美(尽管你这边有点复杂)。

我绝对不会在他们自己的线程上触发事件。让代码使用者决定处理事情的最佳方式


很难给出一个明确的答案,没有更多的细节,但另一个想法是考虑事件的替代方法。可能是消费者可以在自己的时间消费的通知队列?将事件设为向队列中添加了新项。让事情变得更加异步。消费者可以有一个单独的线程来处理队列消息。

我肯定不会在他们自己的线程上触发事件。让代码使用者决定处理事情的最佳方式


很难给出一个明确的答案,没有更多的细节,但另一个想法是考虑事件的替代方法。可能是消费者可以在自己的时间消费的通知队列?将事件设为向队列中添加了新项。让事情变得更加异步。消费者可以有一个单独的线程来处理队列消息。

我有一个收集器类,它打开一个“原始”套接字并从本地网络收集数据。在收集器类内部,套接字读取由接收器线程完成。该线程为从网络读取的每个数据包触发InternalPacketReceived事件。也是收集器类的内部,我还有一个分发线程,订阅接收方的InternalPacketReceived事件。分发服务器的处理程序接收的数据包被添加到内部数据包队列中。然后,分发线程负责使队列中的数据包可供收集器的public PacketReceived事件的订阅者使用。这样,如果分发线程被长时间运行的处理程序暂停,那么接收方将继续毫不延迟地读取数据包

从用户的角度来看,他正在与收集器类上的公共接口进行交互-Start()、Stop()、subscribe to PacketReceived event等。在后台,收集器使用两个线程-Receiver和Distributor-来避免长时间运行的处理程序带来的问题


我希望这是清楚的。

我有一个收集器类,它打开一个“原始”套接字并从本地网络收集数据。在收集器类内部,套接字读取由接收器线程完成。该线程为从网络读取的每个数据包触发InternalPacketReceived事件。也是收集器类的内部,我还有一个分发线程,订阅接收方的InternalPacketReceived事件。分发服务器的处理程序接收的数据包被添加到内部数据包队列中。然后,分发线程负责使队列中的数据包可供收集器的public PacketReceived事件的订阅者使用。在这个