草庐IT

c# - 如何处理来自控制台应用程序的 COM 事件?

我正在使用来自第三方库的COM对象来生成周期性事件。当我从Winforms应用程序使用库时,将对象作为类成员并在主窗体线程中创建它,一切正常。但是,如果我从另一个线程创建对象,我不会收到任何事件。我的猜测是我需要在用于创建对象的同一个线程中有某种事件循环。我需要从控制台应用程序使用这个对象。我想我可以使用Application.DoEvents,但我不想在控制台应用程序中包含Winforms命名空间。我该如何解决这个问题?更新3(2011-06-15):商家终于回复了。简而言之,他们说Application.Run创建的消息泵与Thread.Join创建的消息泵之间存在一些差异,但他们

c# - C# 'event' 关键字的多重含义?

我最近重新阅读了EricLippert的ridiculouslyawesome上的一些旧帖子博客并遇到thistidbit:AconsiderablefractionofthekeywordsofC#areusedintwoormoreways:fixed,into,partial,out,in,new,delegate,where,using,class,struct,true,false,base,this,event,returnandvoidallhaveatleasttwodifferentmeanings.为了好玩,我的同事和我自问自答,除了其中一个关键字之外,我能够为所有

c# - 创建进程时是否有系统事件?

创建新进程时是否有任何事件。我正在编写一个检查某些进程的c#应用程序,但我不想编写一个无限循环来连续迭代所有已知进程。相反,我宁愿检查创建的每个进程或遍历事件触发的所有当前进程。有什么建议吗?Process[]pArray;while(true){pArray=Process.GetProcesses();foreach(ProcesspinpArray){foreach(StringpNameinlistOfProcesses)//justalistofprocessnamestosearchfor{if(pName.Equals(p.ProcessName,StringCompar

c# - 将 lambda 表达式用于事件处理程序的最佳实践

在发现lambda表达式并将它们用作匿名函数之后,我发现自己编写了很多更琐碎的事件,例如:txtLogin.GotFocus+=(o,e)=>{txtLogin.Text=string.Empty;txtLogin.ForeColor=SystemColors.ControlText;};txtLogin.LostFocus+=(o,e)=>{txtLogin.Text="Login...";txtLogin.ForeColor=SystemColors.InactiveCaptionText;};我也放弃了只调用其他函数的事件处理程序,将它们替换为执行相同操作的小型lambda:ba

C# 计时器在它们的间隔时间之前被触发

我们在从Windows服务使用System.Threading.Timer(.NET2.0)时遇到以下问题。大约有12种不同的计时器对象..每个计时器都有到期时间和间隔。这是正确设置的。据观察,在3到4小时后,计时器在它们的间隔结束之前开始发出信号。例如,如果计时器应该在4:59:59发出信号,它会在4:59:52发出信号,即提前7秒。谁能告诉我这种行为的原因是什么以及解决方案是什么?谢谢,斯瓦特语 最佳答案 好问题...原因如下:对于计算机来说,“计时”是一件棘手的事情……您永远不能依赖“间隔”来做到完美。有些计算机只会每14到1

c# - 使用反射在 C# 中引发事件的单元测试

我想测试设置某个属性(或更一般地说,执行某些代码)是否会在我的对象上引发某个事件。在这方面,我的问题类似于UnittestingthataneventisraisedinC#,但我需要很多这样的测试,而且我讨厌样板文件。所以我正在寻找一个更通用的解决方案,使用反射。理想情况下,我想做这样的事情:[TestMethod]publicvoidTestWidth(){MyClassmyObject=newMyClass();AssertRaisesEvent(()=>{myObject.Width=42;},myObject,"WidthChanged");}对于AssertRaisesEv

c# - 等同于 C# 中 VB 的自定义 RaiseEvent block ?

(我知道标题听起来很简单,但等等——这可能不是您认为的问题。)在VB.NET中,我能够编写自定义事件。例如,我有一个单独的线程会定期引发一个事件,并且在该事件上需要更新GUI。我不想让繁忙的线程打扰UI计算,也不想将Me.Invoke(Sub()...)放在事件处理程序中,因为它也是从GUI线程调用的。我想出了这段非常有用的代码。GUI线程将设置EventSyncInvoke=Me(主窗体)。然后线程可以像往常一样简单地引发事件TestEvent,无需特殊代码,它将在GUI线程上无缝执行:PrivateTestEventDelegateAsEventHandlerPublicEvent

c# - 通过事件传递数据

我需要通过事件传递数据。目前,当接收到更多数据(通过comport)时,事件将触发,但之前的事件(&data)尚未处理,因此数据被覆盖。如何以安全的方式处理事件和数据?我有多个这样的事件(15x),所以我不确定使用数据队列是最好的方式还是随事件一起传递数据(如S.O.项目4215845)。示例(这个示例是一个字符串,但我也使用数组、bool值等):在“发送方”端(class1):publiceventEventHandlerevDiaStringMessage=delegate{};privatevoidevDiaStringMessageEvent(){evDiaStringMess

c# - 将事件转换为任务的可重用模式

我想为wrappingEAPpatternastask准备一段通用的可重用代码,类似于Task.Factory.FromAsync的东西为BeginXXX/EndXXXAPMpattern做.例如:privateasyncvoidForm1_Load(objectsender,EventArgse){awaitTaskExt.FromEvent(handler=>this.webBrowser.DocumentCompleted+=newWebBrowserDocumentCompletedEventHandler(handler),()=>this.webBrowser.Naviga

c# - 为什么选择 UnityEvent 而不是原生 C# 事件?

我的意思是,UnityEvents比原生C#事件慢,而且它们仍然存储对接收器的强引用。因此,我能找到在原生C#事件上使用UnityEvents的唯一正当理由是它们与编辑器的集成。我是不是忽略了什么? 最佳答案 AmIoverlookingsomething?不,你没有忽略任何东西。使用UnityEvent的唯一优势和原因是它允许您在编辑器中使用事件。这适用于拖放人员或制作编辑器插件的人员。UnityEvent的另一个优点是它可以防止由于滥用委托(delegate)或使用匿名委托(delegate)与Unity对象而导致的Unity对