首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在类中调用控件

如何在类中调用控件
EN

Stack Overflow用户
提问于 2013-11-07 09:45:25
回答 2查看 91关注 0票数 0

我有一个带按钮的窗口表格。单击该按钮,它将在一个单独的类中启动一个方法。我在一个单独的线程中启动这个方法。

当此class.method完成时,它将引发一个事件返回到windows窗体类。

当发生这种情况时,我在那个单独的类中启动另一个方法,它告诉system.windows.form计时器(在该类中声明)被启用,从而开始处理。

但是计时器没有启动(我在“滴答”事件中放置了一个断点)。

我假设这是因为我在代码开始时就在调用线程的外部声明了计时器。

通常,我会用它来调用同一个线程上的方法.

This.invoke(我的授权名,任何部分);

但是,不能用类调用“this”,因为它与UI线程无关。

我知道这看起来很糟糕,我可以通过将计时器移动到UI线程(windows类)来轻松地解决这个问题。

但是,我忘记了很多年前我是如何做到这一点的,这实际上是为了封装我的代码。

有人能指点我吗?

谢谢

“守则”:

windows类

代码语言:javascript
复制
_webSync = new WebSync(Shared.ClientID);
_webSync.evBeginSync += new WebSync.delBeginSync(_webSync_evBeginSync);
Thread _thSync = new Thread(_webSync.PreConnect);
_thSync.Start();


private void _webSync_evBeginSync()
{
_webSync.Connect();
}

WebSync类

代码语言:javascript
复制
private System.Windows.Forms.Timer _tmrManifestHandler = new System.Windows.Forms.Timer();
public WebSyn()
{
_tmrManifestHandler.Tick += new EventHandler(_tmrManifestHandler_Tick);
_tmrManifestHandler.Interval = 100;
_tmrManifestHandler.Enabled = false;
}


public delegate void delBeginSync();
public event delBeginSync evBeginSync;

public void PreConnect()
{
  while (true)
   {
     if (some condition met)
     {
      evBeginSync();
      return ;
     }
   }       
}

public void Connect()
{          
  _tmrManifestHandler.Enabled = true;
  _tmrManifestHandler.Start();
}

private void _tmrManifestHandler_Tick(object sender, EventArgs e)
{
   //NOT BEING 'HIT'
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-07 10:19:39

在另一个线程上使用System.Windows.Forms.Timer将无法工作。

欲知更多信息,请看这里。

使用System.Timers.Timer代替,如果您使用的是访问UI元素,请小心使用CrossThreadExceptions。

代码语言:javascript
复制
public class WebSync
{
    private System.Timers.Timer _tmrManifestHandler = new System.Timers.Timer();
    public WebSync(object id)
    {
        _tmrManifestHandler.Elapsed += new System.Timers.ElapsedEventHandler(_tmrManifestHandler_Tick);
        _tmrManifestHandler.Interval = 100;
        _tmrManifestHandler.Enabled = false;
    }

    public delegate void delBeginSync();
    public event delBeginSync evBeginSync;

    public void PreConnect()
    {
        while (true)
        {
            if (true /* just for testing*/)
            {
                evBeginSync();
                return;
            }
        }
    }

    public void Connect()
    {
        _tmrManifestHandler.Enabled = true;
        _tmrManifestHandler.Start();
    }

    private void _tmrManifestHandler_Tick(object sender, EventArgs e)
    {
        //NOT BEING 'HIT'
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-11-07 09:58:15

您必须调用_tmrManifestHandler.Start();仅启用是不够的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19832591

复制
相关文章

相似问题

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