Tag: 事件

我是否需要在孤立之前从对象中删除事件订阅?

如果我的软件有两个对象实例,其中一个订阅了另一个的事件。 我是否需要在他们成为孤儿之前取消订阅他们才能被垃圾收集器清理干净? 或者,为什么我应该清除事件关系还有其他原因吗? 如果订阅的对象是孤立但订阅者不是,或反过来怎么办?

为什么事件处理程序总是有返回类型的void?

嘿,我想知道为什么返回类型的事件如 private void button1_Click(object sender, EventArgs e) 永远无效? 它还可以返回任何其他值吗?

.NET对象事件和dispose / GC

编辑:在Joel Coehoorns出色的答案之后,我明白我需要更具体,所以我修改了我的代码,使其更贴近我想要了解的事情…… 事件:据我所知,在后台,事件是EventHandlers又名代表的“集合”,将在事件引发时执行。 所以对我来说这意味着如果对象Y有事件E而对象X订阅了事件YE ,那么Y将引用X,因为Y必须执行位于X中的方法,这样就不能收集X ,并且我理解的事情。 //Creates reference to this (b) in aaEventHappened += new EventHandler(this.HandleEvent); 但这不是Joel Coehoorn所说的…… 但是,事件存在问题,有时人们喜欢将IDisposable与具有事件的类型一起使用。 问题是,当类型X订阅另一个类型Y中的事件时,X现在具有对Y的引用。该引用将阻止Y被收集。 我不明白X将如何引用Y ??? 我修改了一些我的例子来说明我的情况更接近: class Service //Let’s say it’s windows service that must be 24/7 online { A _a; void Start() { CustomNotificationSystem.OnEventRaised += new EventHandler(CustomNotificationSystemHandler) _a = new A(); B b1 = new B(_a); B […]

如何在WPF中使用Application.Exit事件?

我需要删除一些某些文件,然后用户关闭WPF中的程序。 所以我从这里尝试了MDSN代码http://msdn.microsoft.com/en-us/library/system.windows.application.exit.aspx这样: 此代码位于此处App.xml.cs public partial class App : Application { void App_Exit(object sender, ExitEventArgs e) { MessageBox.Show(“File deleted”); var systemPath = System.Environment.GetFolderPath( Environment.SpecialFolder.CommonApplicationData); var _directoryName1 = Path.Combine(systemPath, “RadiolocationQ”); var temp_file = Path.Combine(_directoryName1, “temp.ini”); if (File.Exists(temp1_file)) { File.Delete(temp1_file); } } } // App.xaml 首先它不删除文件,其次这个程序在我按下退出按钮后停留在这个过程中(这真的很奇怪)。 此代码不会给出任何错误。 最后它没有显示MessageBox所以这里有什么不对吗? 我想他只是找不到这个function。

如何手动调用事件?

我在C#中有以下行: _timer.ElapsedTick += _somefunction1; _timer.ElapsedTick += _somefunction2; _timer.ElapsedTick += _somefunction3; 如何在不指定_somefunction的情况下调用订阅_timer.ElapsedTick的所有方法? 沿着这条伪线的某个地方 invoke(_timer.ElapsedTick); 非常感激您的帮忙。 更新 来自@ M.Babcock的例子正在运作。 FireEvent方法具有魔力。 谢谢。 class InvokeFromMe { public event EventHandler RaiseMe; } class MainClass { public MainClass() { InvokeFromMe fromMe = new InvokeFromMe(); fromMe.RaiseMe += fromMe_RaiseMe; fromMe.RaiseMe += fromMe_RaiseMe1; FireEvent(fromMe, “RaiseMe”, null, EventArgs.Empty); //works System.Timers.Timer _timer = new System.Timers.Timer(); _timer.Elapsed […]

加载新的WPF / C#窗口时要触发的最后一个事件是什么?

我正在尝试为我的应用程序加载首选项窗口,我希望最初禁用应用按钮,然后在更新首选项时,再次启用应用按钮。 我有一些绑定到首选项对象的控件数据,发生的情况是窗口加载后,combobox事件被触发。 在一切稳定后,是否有任何事件可以保证在最后发生? 这是我的代码的样子(窗口加载后始终启用应用按钮): private void Window_Loaded(object sender, RoutedEventArgs e) { _preferencesData = new PreferencesDataContext(); LayoutRoot.DataContext = _preferencesData; ButtonApply.IsEnabled = false; } private void ComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { ButtonApply.IsEnabled = true; } 是否有趣的是,这只发生在文本框和combobox中,而不是复选框或单选按钮。

创建跨进程EventWaitHandle

我有两个Windows应用程序,一个是Windows服务,它创建EventWaitHandle并等待它。 第二个应用程序是一个windows gui,通过调用EventWaitHandle.OpenExisting()打开它,并尝试设置事件。 但我在OpenExisting中遇到exception。 例外是“拒绝访问路径”。 windows服务代码 EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset, “MyEventName”); wh.WaitOne(); Windows GUI代码 try { EventWaitHandle wh = EventWaitHandle.OpenExisting(“MyEventName”); wh.Set(); } catch (Exception ex) { MessageBox.Show(ex.Message); } 我用两个示例控制台应用程序尝试了相同的代码,它工作正常。

在C#中附加事件处理程序的两种不同方式是否存在实际差异?

在C#中,引擎盖之间有任何真正的区别(除语法之外): myButton.Click += new EventHandler(myMemberMethod); 和 myButton.Click += myMemberMethod; ?

SynchronizeObject用于事件

使用Timer对象,我可以设置SynchronizingObject属性,以避免在从计时器的事件处理程序更新GUI时使用invoke。 如果我有一个类而不是订阅事件并且必须在事件处理程序中更新GUI,那么是否有类似的概念? 或者我是否必须编写InvokeRequired样板代码?

将“Handles”从VB.NET迁移到C#

我正在将一些代码从VB.NET迁移到C#(3.5)。 我找到了以下结构: Public Event DataLoaded(ByVal sender As Object, ByVal e As EventArgs) Protected Sub Mag_Button_Load_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Mag_Button_Load.Click [..] RaiseEvent DataLoaded(Me, EventArgs.Empty) End Sub [..] ‘Other Class Private Sub LoadData(ByVal sender As Object, ByVal e As System.EventArgs) Handles oData.DataLoaded [..] End Sub 将此类行为转换为C#的最直接方法是什么?