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

从定时器线程调用GUI线程的方法分享

时间:2023-04-10 17:34:45 C#

从定时器线程item调用GUI线程的方法,我弹出自定义对话框通知用户。当我手动运行检查时,一切正常,但是当在计时器Elapsed事件中运行自动检查时,自定义对话框未显示。首先这是线程问题吗?(我假设这是因为相同的代码用于手动和自动检查)。当我运行自动检查时,是否必须从TimersElapsed事件处理程序调用运行检查的方法?我需要在我的自定义对话框类中做些什么吗?编辑:这是一个winforms应用程序。以下是代码示例。(请不要指出此代码示例中的语法错误,这只是一个简单的示例,并非真正的代码)。publicclassMainForm:System.Windows.Forms.Form{//这是完成大部分工作的对象。ObjectThatDoesWorkMyObjectThatDoesWork=newObjectThatDoesWork();MyObjectThatDoesWork.NewItemsFound+=newNewItemsFoundEventHandler(Found_New_Items);privatevoidFound_New_Items(objectsender,System.EventArgse){//显示自定义对话框以提醒用户。}//在我的类中并不存在的方法,//但表明主窗体可以调用Update进行手动检查。privatevoidButton_Click(objectsender,System.EventArgse){MyObjectThatDoesWork.Update();}//MainForm的其余部分有无聊的主窗体内容}publicclassObjectThatDoesWork{System.Timers.Timertimer;publicObjectThatDoesWork(){timer=newSystem.Timers.Timer();计时器.间隔=600000;timer.AutoReset=true;timer.Elapsed+=newnewSystem.Timers.ElapsedEventHandler(TimeToWork);定时器。开始();}privatevoidTimeToWork(对象发送者,System.Timers.ElapsedEventArge){更新();}publicvoidUpdate(){//检查更新并在发现新项目时引发事件。//事件被主窗体消费。OnNewItemsFound(这个);}publicdelgatevoidNewItemsFoundEventHandler(objectsender,System.EventArgse);公共事件NewItemsFoundEventHandlerNewItemsFound;protectedvoidOnNewItemsFound(objectsender){if(NewItemsFound!=null){NewItemsFound(sender,newSystem.EventArgs());在阅读了一些评论和答案之后,我认为我的问题是我使用的是System.Timers.Timer而不是System.Windows.Forms.Timer编辑:更改为Forms.Timer后,初始测试看起来很好(但不存在新项目,因此您看不到自定义对话框)。我添加了一些代码以在调用更新方法时将线程ID输出到文件。对于Timers.Timer,线程id不是GUI线程,但是对于Forms.Timer,线程id与GUI相同。你用的是哪个定时器?System.Windows.Forms.Timer自动触发UI线程上的事件。如果您正在使用其他东西,则需要使用Control.Invoke来调用UI线程上的方法。您应该在此处使用Forms.Timer,或者如果您使用其他类型的计时器,请使用.Invoke()来序列化对UI的调用您的应用程序是WPF应用程序吗?如果是这样,您必须将工作从后台线程委托给与UI线程关联的Dispatcher。发布一些代码,以便您可以获得更好的帮助并查看Dispatcher类http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke.aspx以上是C#学习教程:从定时器线程调用GUI线程上的方法来分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注—privatestaticSystem.Threading.SynchronizationContext_UI_Context;//从UI线程调用此函数一次internalstaticvoidinit_CallOnUIThread(){_UI_Context=System.Threading.SynchronizationContext.Current;}publicstaticvoidCallOnUIThread(Actionaction,boolasynchronous=false){if(!asynchronous)_UI_Context.Send((o)=>{action();},null);else_UI_Context.Post((o)=>{action();},null);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: