0

我有一个带有按钮的 Windows 窗体。我单击该按钮,它会在一个单独的类中启动一个方法。我在一个单独的线程中启动此方法。

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

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

但是计时器没有启动(我确实在 'tick' 事件中设置了一个断点)。

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

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

this.invoke(mydelegatename, any pars);

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

我知道这一切看起来很糟糕的架构,我可以通过将计时器移动到 UI 线程(Windows 窗体类)来轻松解决这个问题。

但是,我已经忘记了多年前我是如何做到这一点的,这确实是一种封装我的代码的尝试。

任何人都可以启发我吗?

谢谢

编码:

[视窗类]

_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 类]

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'
}
4

2 回答 2

2

你必须打电话_tmrManifestHandler.Start();启用是不够的。

于 2013-11-07T09:58:15.127 回答
1

在另一个线程上使用 System.Windows.Forms.Timer 将不起作用。

更多信息请看这里。

请改用 System.Timers.Timer,如果您正在使用访问 UI 元素,请注意 CrossThreadExceptions。

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'
    }
}
于 2013-11-07T10:19:39.440 回答