gpt4 book ai didi

c# - 使用现有API的.Net中事件的线程上下文是什么?

转载 作者:行者123 更新时间:2023-12-03 13:22:42 25 4
gpt4 key购买 nike

当使用API​​处理.Net中的异步事件时,我发现自己无法预测该库如何扩展大量对象。

例如,使用Microsoft.Office.Interop.UccApi库,当我创建端点时,它会在电话事件发生时获取事件。现在,假设我要创建1000个端点。每个端点的事件数量很小,但是API幕后发生的事情能够跟上事件流的发展吗?我不知道,因为它从不说它是如何设计的。

假设我要在主线程中创建所有1000个对象。然后,我想将Login方法放入一个大线程池中,以便所有对象并行登录。然后,一旦所有对象都已登录,下一阶段将开始。

API引发的事件回调是否在原始创建线程中发生?一个单独的线程池?还是我正在使用ThreadPool.QueueUserWorkItem访问的同一个线程池?

我会更好地将每个对象放在自己的线程中吗?在每个线程中分组几个对象?还是只在主线程中创建所有1000个对象,然后通过.Net magic一切正常就可以了吗?

谢谢

最佳答案

来自互操作程序集的事件只是COM连接点周围的包装器。来自连接点的调用到达的线程取决于在该连接点上建议的对象的线程模型。 COM将为此确保适当的线程切换。

如果您的对象是在主线程(在.Net中通常是STA)上实现的,则所有事件都应在同一线程上到达。如果您希望调用从COM线程池(我认为与CLR线程池相同)到达随机线程,则需要在配置为MTA的线程上创建对象。

我强烈建议不要为每个对象创建线程:1)如果将这些线程创建为STA,则每个线程都会有一个消息队列,占用系统资源; 2)如果将它们创建为MTA,则没有任何东西可以保证事件调用将到达您的线程上; 3)您将有1000个空闲线程不执行任何操作,仅等待事件关闭;和4)启动和关闭所有这些线程将对您的应用程序造成可怕的性能损失。

关于c# - 使用现有API的.Net中事件的线程上下文是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/227446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com