Tag: 事件

重启PC时,C#.Net exe不会关闭,导致机器不能重启

我们有一个内置在C#中的SmartClient,当它正在重新启动运行的PC时,它仍然保持打开状态。 这将暂停重新启动过程,除非用户首先关闭SmartClient或进行其他一些手动干预。 当基础架构团队远程安装需要重新启动计算机的新软件时,这会导致问题。 让SmartClient应用程序从Windows识别关闭/重启事件并优雅地自杀的任何想法? 更新:这是一个具有多个gui线程的高线程应用程序。 是的,多个gui线程。 它实际上是许多项目的整合,它们本身可以是独立的应用程序 – 所有这些都是从单个exe启动和管理,集中管理这些方法并跟踪这些线程。 我不相信使用后台线程是一种选择。

在C#Windows窗体中更改控件状态时,如何忽略触发的简单事件?

我在C#Windows窗体中创建一个简单的表单,并遇到一个常见的情况,一个控件可以改变另一个控件的状态,但两个控件的事件都会触发其他一些方法。 例如,考虑一个Checkbox和NumericUpDown ,其中任何一个的状态或值应触发重绘的内容。 NumericUpDown依赖于Checkbox这意味着除非选中Checkbox否则可以禁用或忽略它。 但是,用户可以方便地更改NumericUpDown值,并自动检查Checkbox是否已经存在。 所以这里是有问题的方法: private void chkState_CheckedChanged(object sender, EventArgs e) { RedrawStuff(); } private void numStateValue_ValueChanged(object sender, EventArgs e) { if (!chkState.Checked) chkState.Checked = true; RedrawStuff(); } 问题当然是更改NumericUpDown值会导致RedrawStuff()触发两次。 我的解决方法是引入一个布尔值,我可以有效地否定这种行为,但有时它会变得混乱: bool _preventStateChange; private void chkState_CheckedChanged(object sender, EventArgs e) { if (_preventStateChange) return; RedrawStuff(); } private void numStateValue_ValueChanged(object sender, EventArgs e) { _preventStateChange = true; […]

AppDomain.CurrentDomain.ProcessExit和cleanup

当我需要在应用程序关闭之前使用Stop()函数停止后台线程时,我有简单的应用程序。 问题是我的Main()函数有几个退出点(return语句) static void Main(string[] args) { /// some code return; // some code return; //// etc } 我尝试使用AppDomain.CurrentDomain.ProcessExit作为清理的标志位置,但它永远不会被调用(至少在有后台线程时)。 有没有办法找出一些很好的方法来实现它?

C#::何时使用事件或从事件处理接口派生的对象集合?

我认为这是一个简单的“问题”,我已经找到了几个解决方案,但我不知道哪种方式可以用于C#中的最佳实践。 在应用程序的生命周期中,我有一个主对象(比如一个单例)。 这个“MasterClass”创建了一堆新类型的对象,每次调用MasterClass.Instance.CreateSlaveObject时都会说“SlaveClass”。 此MasterClass还监视一些其他对象的状态更改,当发生这种情况时,通知它创建的SlaveClass对象的更改。 看起来很简单。 因为我来自原生的C ++世界,所以我首先使用它来创建一个界面 Interface IChangeEventListener { void ChangeHappened(); } 我从中派生出“SlaveClass”。 然后在我的“MasterClass”中,我有: … IList slaveList; … CreateSlaveObject { … slaveList.Add(slave); } … ChangeHappened() { … foreach(var slave in slaveList) { slave.ChangeHappened(); } } 这很有效。 但是我一直在想,如果有另一种(更好的)方法可以做到这一点。 所以我对这个主题进行了更多研究,并看到了C#事件。 因此,我不是在MasterClass中维护一个奴隶集合,而是将MasterClass注入SlaveClass的ctor(或通过一个属性),让SlaveClass对象将它的ChangeHappened作为事件处理程序添加。 这将说明: …Master… public delegate void ChangeHappenedDelegate(object sender, NewsInfoArgs args); public event NewUpdateDelegate ChangeHappenedEvent; …. public […]

尝试写入事件日志时出错 – 无法打开源“SourceName”的日志。 您可能没有写访问权限

我们目前正在尝试将现有的经典ASP页面集成到我们记录到事件日志的新方法中。 我们通过将.NET程序集公开为COM对象来实现此目的,该对象执行实际日志记录到事件日志。 这一切都正常,但是当我们尝试写入事件日志时,我们收到错误“无法打开源’SourceName’的日志。您可能没有写访问权限。” 从aspx页面调用时,日志代码本身也可以工作。 这显然是IUSR_machinename帐户的权限问题,但是,通过查看其他一些相关post,我们尝试了许多解决方案而没有任何成功。 编辑HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / EventLog / Application / RestrictGuestAccess – 将其设置为0 将IUSR_machinename添加到本地管理员组并删除来宾组 编辑CustomSD并将(A ;; 0x0002 ;;; AU)附加到此处的值 我们唯一的成功是使用ASP.NET模拟在服务器上使用新创建的本地管理员帐户。 使用此用户可以使用,但这是一种解决方法,而不是解决初始权限问题。 还有什么我们可以尝试使用IUSR_machinename帐户获取权限吗?

为什么没有对EventHandler 的约束?

我只是偶然发现(编译时我认为不会编译的东西)EventHandler 并不局限于System.EventArgs类型。 这是内联文档: #region Assembly mscorlib.dll, v4.0.0.0 // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll #endregion namespace System { // Summary: // Represents the method that will handle an event. // // Parameters: // sender: // The source of the event. // // e: // An System.EventArgs that contains the event data. // // Type parameters: // TEventArgs: […]

如何在自定义用户控件上创建单击事件?

我已经创建了一个自定义用户控件。 我是否可以添加单击事件,以便当有人单击控件区域中的任何位置时,会触发单击事件? 用户控件定义为: XAML: C#: public partial class TabItem : UserControl { public static readonly DependencyProperty ImageProperty = DependencyProperty.Register(“TabItemImage”, typeof(string), typeof(TabItem), null); public static readonly DependencyProperty TextProperty = DependencyProperty.Register(“TabItemText”, typeof(string), typeof(TabItem), null); public string TabItemImage { get { return (string)GetValue(ImageProperty); } set { SetValue(ImageProperty, value); } } public string TabItemText { get { return (string)GetValue(TextProperty); […]

使活动符合Net准则有什么好处?

我了解如何根据Net Framework指南使用事件,但使用此模式有什么好处? http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx : .NET Framework准则指出用于事件的委托类型应该采用两个参数,一个“对象源”参数指示事件的来源,一个“e”参数封装有关该事件的任何其他信息。 “e”参数的类型应该来自EventArgs类。 对于不使用任何其他信息的事件,.NET Framework已经定义了适当的委托类型:EventHandler。 a)我发现使用“对象源”值作为第一个参数有一些好处,因为在某些情况下,多个对象可以将其事件设置为相同的方法。 因此,如果例如我们有10个对象并且如果所有10个对象将它们的事件设置为事件处理程序M,则在M内部我们可以使用“对象发送者”参数值来标识事件调用的发起者。 但据我所知,“对象源”参数仅在事件方法中引发事件时才有用。 因此,如果在静态方法中引发了事件,那么“对象源”参数是没有用的?! b)根据Net Framework准则使用事件是否还有其他好处? c)无论可能带来什么好处,为什么他们会超越必须的麻烦 编写一个额外的代码,将所需的参数放入从EventArgs派生的对象中 在事件处理程序中编写一个额外的代码,以从EventArgs派生的对象中提取信息? 谢谢

我应该使用EventArgs还是简单的数据类型?

我正在创建一个有趣和实践的库,我想知道,在举办活动时,如何选择传递自己的EventArgs衍生物或仅仅是数据类型。 例如,在我的库中我有这样的东西: public delegate void LostConnectionEventHandler(string address); public delegate void MessageReceieved(byte[] bytes); 这是什么标准做法? 我应该用MessageEventArgs替换string address和用MessageEventArgs替换byte[] bytes吗? 我知道其中一个工作得很好而且这个问题可能是主观的但我仍然对高级程序员在决定是否包含他们自己的EventArgs或直接传递数据时所经历的思考过程感到好奇。 谢谢!

c#事件执行是线程安全的吗?

我阅读了很多事件和线程讨论,但是如果我从事件中取消并稍后尝试调用它,那么所有这些都会集中在“会发生什么”。 我的问题是不同的……如果我在线程A中有一个进程以毫秒1触发事件“我完成”,并且在线程B中有一个进程以毫秒2触发事件“我完成”将会发生什么。 这两个进程都被用于监听和处理事件的相同方法。 因此,C#必须执行处理事件2次的方法:1次用于在线程A中触发的事件,1次用于从线程B触发的事件。 会发生什么?? 当“来自线程A的第一个事件”开始执行处理事件的方法时,C#是否锁定方法,并在完成执行时解锁方法,从而允许其他等待“事件”执行方法内容? 或者从线程A触发的事件将开始执行处理事件的方法,1毫秒后,从线程B触发的事件也将在相同的方法上开始执行,而不会注意到当前该方法正由其他方执行“处理”??? 我问这个,因为我想在捕获事件的方法中写一些文件,但如果方法可以同时执行(取决于事件被触发的时间),我想我不能在这里做,因为关于该文件将是同时写入同一文件的2个进程之间的混合(不是文件的有效信息)。 我的代码看起来像这样(有点长,对不起)。 请注意这不会编译,只是一个示例,以显示我在做什么: public partial class MainForm : Form { FTPClientManager client = null; public MainForm() { InitializeComponent(); } private void btnConnect_Click(object sender, EventArgs e) { Connect(this.tbFTPServer.Text.Trim()); this.lstLog.Items.Add(“Connected”); //This lstLog is a list box that will have a list of downloaded files from all threads. } void Connect(string […]