我的计时器有问题,它没有到达tick
,我也没有看到问题。
class Class1
{
bool check;
Timer net;
private bool timerComplete = false;
private int timerIndex = 0;
public Class1()
{
check = true;
net = new Timer();
}
public void Do()
{
System.Threading.Thread.Sleep(4*1*1000);
net.Interval = 1 * 1000;
net.Tick+=new EventHandler(net_Tick);
net.Start();
while (!timerComplete)
System.Threading.Thread.Sleep(1000);
}
void net_Tick(object sender, EventArgs e)
{
timerIndex++;
if (timerIndex >= 10)
{
timerComplete = true;
return;
}
//my code
}
}
主要
这是我调用Do()
函数
class Program
{
const int SW_HIDE = 0;
static void Main(string[] args)
{
Hide();
Class1 c = new Class1();
c.Do();
}
public static void Hide()
{
var handle = GetConsoleWindow();
// Hide
ShowWindow(handle, SW_HIDE);
}
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}
答案 0 :(得分:2)
您忘记拨打Do()
,这是设置计时器属性并启动它的方法。
编辑:
如果它是你的第二个计时器,那个没有工作的计时器(你仍然没有指定哪个计时器不工作),那是因为你正在创建它而不是保存任何对它的引用,因此你失去对它的控制。
答案 1 :(得分:0)
您的代码有点令人困惑,但基本上您正在寻找以下
static void Main(string[] args) {
var myObject = new Class1();
myObject.Do();
// give the program 10 minutes to run. This is arbitrary so you will want to change
// to something realistic or have a callback to signal "done".
System.Threading.Thread.Sleep(10 * 60 * 1000);
}
应该这样做,或者至少让你开始吧!
其他注意事项 - 另一个注意事项是第二个计时器调用名为net_Tick
的方法。我在提供的代码中没有看到这一点,所以我认为没有问题...
替代方法
另一种方法是阻止Do
方法而不是使主线程暂停,直到计时器完成(或者你想要停止)。为此,我添加了以下Class1
中需要更改的代码片段:
public class Class1 {
// add a variable for timer complete
private bool timerComplete = false;
private int timerIndex = 0;
public void Do()
{
t.Enabled = true;
// start timer same as normal:
t.Interval = 10 * 1000;
t.Tick += new EventHandler(t_Tick);
t.Start();
// busy wait to block the thread
while (!timerComplete) {
System.Threading.Thread.Sleep(1000);
}
}
void t_Tick(object sender, EventArgs e)
{
// give this a stopping point
timerIndex++;
if (timerIndex >= 10) {
timerComplete = true;
return;
}
// leave the rest of the tick as it was before...
}
}
执行此操作后,您可以从Sleep
例程中删除对Main
的调用,但一切都应该仍然有效。祝你好运!