【问题标题】:windows forms timer: is lock requiredWindows 窗体计时器:是否需要锁定
【发布时间】:2017-07-23 12:07:16
【问题描述】:

我的应用程序上有一个按钮,其点击事件:

private void btn_Click(object sender, EventArgs e)
{
     btn_DoMyAction();
}

btn_DoMyAction

private void btn_DoMyAction()
{
    //lock (_lock) //--> Is this necessary
    {
        ...
        ... //long code block(I mean non automic)
        ...
    }
}

我正在从点击事件和 Windows 计时器滴答声中调用 btn_DoMyAction

private void myTimer_Tick(object sender, EventArgs e)
{
    btn_DoMyAction();
}

我有两个问题:

1-) btnProcessNextBandBarcode_DoMyAction 中是否需要 lock (我问的是第一个问题,因为就我调试而言,它似乎排队调用,并且似乎不需要锁定)
2-) 我想跳过线程而不是在滴答声或按钮单击时排队

另外的问题是:

  • 如果第一个问题的答案是否定的,如果从线程调用btn_DoMyAction(无计时器),我应该如何采取措施来实现自动性

【问题讨论】:

    标签: c# multithreading winforms timer


    【解决方案1】:
    1. 这取决于您使用的计时器。如果您从工具箱中获取计时器,则您使用的是 System.Windows.Forms.Timer。根据documentation

    此 Windows 计时器专为使用 UI 线程执行处理的单线程环境而设计。

    所以你不必使用锁,因为btn_ClickmyTimer_Tick 在同一个线程中执行。

    补充问题: 如果你从另一个线程调用btn_DoMyAction,通常你应该使用lock,因为它可能会从UI线程和另一个线程调用。

    编辑:
    2. 因为Timer是在UI线程中执行的,点击按钮时执行的动作也是在UI中执行的,所以不会出现tick到达但之前的执行没有完成的情况(因为一切都在一个线程中执行)。如果您希望计时器在此操作完成后特定时间过去后开始执行,您应该使用不同的计时器 - System.Threading.Timer 应该没问题 - 您可以在执行结束时启动计时器(当执行由计时器引起时)。

    【讨论】:

    • 感谢您的帮助,第二个问题,如果之前的代码执行尚未完成,如果下一个计时器滴答到达,我想跳过它,而不是排队
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多