我有一个带计时器的班级,如下所示
public class helper
{
Timer timer = new Timer();
private int counter = 0;
private int returnCode = 0;
public int Process()
{
SetTimer();
Console.WriteLine("The application started ");
return counter;
}
public void SetTimer()
{
int optionalWay = 0;
// Create a timer with a two second interval.
timer = new System.Timers.Timer(2000);
// Hook up the Elapsed event for the timer.
timer.Elapsed += (sender, e) => OnTimedEvent(sender, e, optionalWay);
timer.AutoReset = true;
timer.Enabled = true;
}
private void OnTimedEvent(Object source, ElapsedEventArgs e, int optionalWay)
{
counter++;
Console.WriteLine("Timer is ticking");
if (counter == 10)
{
timer.Stop();
timer.Dispose();
returnCode = returnCode + 1;
}
}
}
我下面有这样的主要功能
public static void Main()
{
helper helper = new helper();
int code = helper.Process();
Console.WriteLine("Main " + code.ToString());
Console.ReadLine();
}
我想做的是在计时器停止时而不是在此之前返回main
,我的计时器类运行正常,主要如下所示
所以main应该等到定时器的结果为1,然后结束进程
最佳答案
该代码可以正常工作。 helper.Process()
函数内部没有任何东西可以等待或阻止执行,因此该函数会在甚至执行main
之前立即返回到OnTimedEvent
。
解决方法可以通过在helper
类中实现一个事件并在计时器完成其工作之后引发该事件来完成。 main
可以监听该事件并采取相应的措施。
public class helper
{
Timer timer = new Timer();
private int counter = 0;
private int returnCode = 0;
public event EventHandler<int> Done;
...
private void OnTimedEvent(Object source, ElapsedEventArgs e, int optionalWay)
{
counter++;
Console.WriteLine("Timer is ticking");
if (counter == 10)
{
timer.Stop();
timer.Dispose();
returnCode = returnCode + 1;
if (Done != null)
{
Done.Invoke(this, returnCode);
}
}
}
}
而在
Program.cs
static void Main(string[] args)
{
helper helper = new helper();
helper.Done += helper_Done;
helper.Process();
Console.ReadLine();
}
static void helper_Done(object sender, int e)
{
Console.WriteLine("Main " + e.ToString());
}
更新资料
Timer类使用ThreadPool中的新线程执行
Elapsed
事件处理程序。因此,它无法返回在其他线程上运行的Main
。简而言之:使用计时器无法实现您想做的事情。这是使用
Thread.Sleep()
的另一种解决方案,它将满足您的要求,但是请记住不要使用Thread.Sleep()
,因为这样不建议这样做。public class helper
{
private int counter = 0;
private int returnCode = 0;
public int Process()
{
Console.WriteLine("The application started ");
StartTimer(2000);
return returnCode;
}
private void StartTimer(int ms)
{
while (counter++ < 10)
{
System.Threading.Thread.Sleep(ms);
Console.WriteLine("Timer is ticking");
}
returnCode = returnCode + 1;
}
}
class Program
{
static void Main(string[] args)
{
helper helper = new helper();
int code = helper.Process();
Console.WriteLine("Main " + code.ToString());
Console.ReadLine();
}
}
同样,将
Thread.Sleep
用于延迟执行也不是一个好习惯,并且Thread.Sleep
与Timer.Elapsed
相比准确度较低。尝试更改应用程序的设计并使用事件或回调函数。关于c# - 当计时器从C#控制台应用程序中的其他类停止时如何返回main,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48889113/