Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以使用WinForms表单中的计时器组件来检查单选按钮的状态并启用/禁用按钮吗?_C#_Winforms_Multithreading - Fatal编程技术网

C# 我可以使用WinForms表单中的计时器组件来检查单选按钮的状态并启用/禁用按钮吗?

C# 我可以使用WinForms表单中的计时器组件来检查单选按钮的状态并启用/禁用按钮吗?,c#,winforms,multithreading,C#,Winforms,Multithreading,我的小windows窗体应用程序有两个单选按钮,最初两个按钮都没有选中。在选中其中一个按钮之前,应禁用“Go”按钮 我找到了一个非常简单的方法来获得这个,但我不确定我是否在为自己设置一个随机崩溃 我添加了一个计时器组件,启用了它,在滴答声事件中: private void timer1_Tick(object sender, EventArgs e) { bool canGo = (_usRadioButton.Checked || _intlRadioButton.Checked);

我的小windows窗体应用程序有两个单选按钮,最初两个按钮都没有选中。在选中其中一个按钮之前,应禁用“Go”按钮

我找到了一个非常简单的方法来获得这个,但我不确定我是否在为自己设置一个随机崩溃

我添加了一个计时器组件,启用了它,在滴答声事件中:

private void timer1_Tick(object sender, EventArgs e)
{
    bool canGo = (_usRadioButton.Checked || _intlRadioButton.Checked);
    if (_goButton.Enabled != canGo)
    {
        _goButton.Enabled = canGo;
    }
}

我知道还有其他的方法,我只是想知道这种方式是否有效,或者在窗体更新其中一个复选框上的Checked属性的同时触发计时器时,最终用户是否会抛出异常?

更好的解决方案是订阅单选按钮的CheckedChanged事件,然后启用“Go”事件处理程序中的按钮


这将解决您在使用这种方法时遇到的任何计时问题。

我不确定它是否更安全,但您也可以订阅CheckedChanged事件,并使用该处理程序代码启用Go按钮。这将为您节省一个必须无限期运行的计时器。

如果我理解正确,您已经知道CheckedChanged事件,并且只询问代码中的冲突。因此:

据我所知,它不是多线程的,也没有危险。勾号事件实际上不会在计算机更新选中状态的同时触发

如果在Form.Load and Timer.勾选中放置跟踪:

private void Form_Load(object sender, EventArgs e)
{ 
    Console.WriteLine("Form_Load/Thread.CurrentThread.ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId);
}

private void timer1_Tick(object sender, EventArgs e)
{
     Console.WriteLine("timer1_Tick/Thread.CurrentThread.ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId);
}
结果表明:

Form_Load/Thread.CurrentThread.ManagedThreadId=9
timer1_Tick/Thread.CurrentThread.ManagedThreadId=9

谢谢,你让我意识到这是同样的代码,但是,你同意它有更少的“去耦合”吗?我可能错了…@Gabriel-我认为这两种方法的“对联”都是一样的。您需要读取单选按钮的值来设置按钮的启用状态。这对我来说是一个很好的视角,因为我甚至没有考虑选中的属性-我认为订阅两个单选按钮的CheckChanged事件比计时器的勾号事件更糟糕,结合计时器与窗体没有直接关系的事实。。。也许我的缺陷是将事件视为“耦合”因素。好吧,你是说勾号事件在表单的线程上,这可能是我应该问的问题(我在想)。是的。但这只是“据我所知”。也许你最好等着或者肯定地回答这个问题。我相信我已经用痕迹验证了你的答案——我将对它进行编辑以包括这个(希望没问题,如果不只是杀死它的话)。​​​​​​​​​​​​​​​​​​​​​​​​​