首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >windows窗体计时器:是否需要锁?

windows窗体计时器:是否需要锁?
EN

Stack Overflow用户
提问于 2017-07-23 12:07:16
回答 1查看 348关注 0票数 0

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

代码语言:javascript
复制
private void btn_Click(object sender, EventArgs e)
{
     btn_DoMyAction();
}

btn_DoMyAction

代码语言:javascript
复制
private void btn_DoMyAction()
{
    //lock (_lock) //--> Is this necessary
    {
        ...
        ... //long code block(I mean non automic)
        ...
    }
}

我从单击事件和windows计时器滴答调用btn_DoMyAction

代码语言:javascript
复制
private void myTimer_Tick(object sender, EventArgs e)
{
    btn_DoMyAction();
}

我有两个问题:

) lockbtnProcessNextBandBarcode_DoMyAction中是必要的(我是在问第一个问题,因为就我调试而言,它似乎是队列调用,并且锁似乎是不必要的)

代码语言:javascript
复制
2-) I want to skip thread instead of queue on tick or button click 

另一个问题是:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-23 12:39:52

  1. 这取决于你用的是哪个计时器。如果您从工具箱中获取计时器,则使用System.Windows.Forms.Timer。根据文档的说法

此Windows计时器设计用于单线程环境,其中UI线程用于执行处理。

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

附加问题:如果从另一个线程调用btn_DoMyAction,则应该使用lock,因为它可能是从UI线程和另一个线程调用的。

编辑:

  1. 由于计时器是在UI线程中执行的,单击按钮上执行的操作也是在UI中执行的,所以会出现勾选的情况,但是以前的执行不能完全完成(因为所有的操作都在一个线程中执行)。如果您希望计时器在特定时间之后开始执行,则应该使用不同的计时器-- System.Threading.Timer应该可以--您可以在执行结束时(当由计时器引起的执行时)启动计时器。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45264910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档