我有一个带按钮的窗口表格。单击该按钮,它将在一个单独的类中启动一个方法。我在一个单独的线程中启动这个方法。
当此class.method完成时,它将引发一个事件返回到windows窗体类。
当发生这种情况时,我在那个单独的类中启动另一个方法,它告诉system.windows.form计时器(在该类中声明)被启用,从而开始处理。
但是计时器没有启动(我在“滴答”事件中放置了一个断点)。
我假设这是因为我在代码开始时就在调用线程的外部声明了计时器。
通常,我会用它来调用同一个线程上的方法.
This.invoke(我的授权名,任何部分);
但是,不能用类调用“this”,因为它与UI线程无关。
我知道这看起来很糟糕,我可以通过将计时器移动到UI线程(windows类)来轻松地解决这个问题。
但是,我忘记了很多年前我是如何做到这一点的,这实际上是为了封装我的代码。
有人能指点我吗?
谢谢
“守则”:
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'
}发布于 2013-11-07 10:19:39
在另一个线程上使用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-07 09:58:15
您必须调用_tmrManifestHandler.Start();仅启用是不够的。
https://stackoverflow.com/questions/19832591
复制相似问题