当前位置: 首页 > 编程语言 > C#

如何在不等待事件监听器运行的情况下触发事件?Share

时间:2023-04-10 19:02:44 C#

如何在不等待事件侦听器运行的情况下触发事件?我对.NET(C#)中的事件有疑问。我必须为后台任务正在运行的几种情况编写代码,并且我想通知主线程或控制器类发生了某些事情,例如任务已完成或文件复制完成,但我没有希望后台任务等待主线程的委托来处理事件。我想做一些类似消息传递的事情:发送消息,但谁在乎他们用它做什么。例如:写一个类来顺序处理多个进程,一个接一个。每个进程都需要在后台线程上运行。当工作完成时,事件触发并告诉控制器它完成了(假设使用了OnCompleted()方法)问题是,如果控制器的事件处理程序用于启动后续流程,则前一个流程的OnComplete方法将保留在调用堆栈中(永远不会完成执行),直到所有进程完成。在那种情况下,后台任务如何在不将事件引发方法保留在堆栈上的情况下通知控制器类工作已完成?示例2:备份程序。后台线程运行以将每个文件复制到目的地。后台需要通知UI最后复制的文件,但不需要等待UI更新。相反,它只是想说,“顺便说一句,这里有一些信息。现在,让我回去工作。”事件侦听器不应阻止事件引发者的处理。引发事件时(如上所述),您可以执行异步调用,或者只是在后台线程上引发事件本身:voidOnUpdated(EventArgse){EventHandlerh=this.Updated;如果(h!=null)h(e);}voidDoStuff(){BigMethod();ThreadPool.QueueUserWorkItem(OnUpdated,EventArgs.Empty);大方法2();如果异步引发,多个侦听器将同时处理您的事件。至少,这需要一个线程安全的EventArg类。如果您希望它们也与您的类进行交互,那么您应该非常仔细地记录它们或使它们成为线程安全的。在后台线程上引发事件对您的类方法有相同的警告,但您不必担心EventArgs类本身。听起来您正在尝试异步调用事件调用列表中的委托。我建议您阅读.NETAsynchronousEventstoSendProcessStatetoUserInterface:.NETFramework为我们提供了在类中异步引发事件(和其他项目)的概念。这意味着我们可以以这样一种方式引发事件,即该事件的订阅者(通常是用户界面)不会留在引发事件的方法中进行处理。好处是它不会对我们业务层方法的性能产生负面影响。让第一个事件只启动线程什么都不做,那么其他事件监听器是什么都无关紧要。对于您的案例2备份程序。代码示例会异步触发文件拷贝,拷贝完成后会调用回调方法。在回调中,如果你不想等待UI更新,那么你将不得不异步调用UI更新代码你可以使用异步委托publicclassAsyncFileCopier{publicdelegatevoidFileCopyDelegate(stringsourceFile,stringdestFile);publicstaticvoidAsynFileCopy(stringsourceFile,stringdestFile){FileCopyDelegatedel=newFileCopyDelegate(FileCopy);IAsyncResult结果=del.BeginInvoke(sourceFile,destFile,CallBackAfterFileCopied,null);}publicstaticvoidFileCopy(stringsourceFile,stringdestFile){//复制文件的代码}publicstaticvoidCallBackAfterFileCopied(IAsyncResultresult){//通过调用asyncdel通知UI(可能使用fire&forget方法或其他回调,如果desired)}}你可以调用它:AsyncFileCopier.AsynFileCopy("abc.txt","xyz.txt");这个链接告诉你异步编码的不同技巧以上是C#学习教程:如何在不等待事件监听器运行的情况下触发事件?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: