2013-03-08 100 views
-3

在c#console应用程序中不断调用函数。没有使用无限循环和递归,因为如果使用那些然后CPU使用更多。请问任何人可以帮助我解决这个问题。有人建议我使用后台线程,但它不会连续调用函数。c#中的函数调用

Thread th = new Thread(//fun); 
th.IsBackground = true; 
th.start(); 
+1

为了不使用大量不想连续调用的CPU,您需要定期调用它。这意味着在每次通话之间引入一个等待期。 – dutt 2013-03-08 12:03:00

+0

一个相关的问题是http://stackoverflow.com/questions/1550303/background-threads-in-c-sharp。正如你所看到的,你必须使用th.Start()并在静态函数下使用它,例如main。 – user1929959 2013-03-08 12:03:37

回答

0

使用短间隔的系统计时器。

在定时器的“滴答”事件:

  • 停止计时器
  • 调用函数
  • 重启

系统计时器的事件在一个线程池运行定时器线程使您的控制台应用程序线程继续正常。该功能按照时间间隔允许的频率运行,在应用程序的持续时间内。没有递归。没有无限循环。

0

如果你想连续调用它,那么需要高CPU使用率:因为CPU总是忙着做你想做的事情。

如果你想有较低的CPU使用率,那么你不能连续运行你的功能,但只能在一个(可能非常小)的时间间隔。

你必须决定。

0

你可以使用线程代码,但一个线程只是有效地调用函数,这意味着你的函数需要递归或者它需要一个无限循环。

public void StartThread() 
{ 
    Thread th = new Thread(function); 
    th.IsBackground = true; 
    th.start(); 
} 

public void function() 
{  
    //preferably have some way of killing this if needs be so don't necessarily use 'true' 
    while(true) 
    { 
     //do stuff 

     //sleep an appropriate amount of time to not overload the cpu 
     //This sleeps (basically pauses thread) for 10 milliseconds 
     Thread.Sleep(10); 
    } 
} 

添加Thread.Sleep将停止您所指的CPU的超载。只需运行一段适合您的应用程序的时间即可。如果它正在更新GUI上的值,那么用户不会真正注意到每半秒(Thread.Sleep(500))或每毫秒(Thread.Sleep(1))更新值是否更新。

0

我是不知道我是否得到了答案,但让我解释一下线程是如何工作的。


线程

线程,在大多数编程语言,是有效地分手了执行力,为同步执行的做法。这意味着两种方法可以同时运行。线程

一个例子使用一个线程的

常见用途,是监听的服务器上的连接。所以,你就会有一个线程,这样的:

while(true) 
{ 
    // Listen to incoming messages. 
} 

的无限循环是因为,在任何时候,你想停止侦听传入的消息。这是服务器的角色;管理连接。但是,程序执行完成后线程被终止。这被认为是常见的做法的原因是,由于这是在单独的线程上运行的事实,因此它不会像您想象的那样影响性能。 C#非常擅长处理多个线程;大多数语言也是如此。

替代

好吧,看它这样。如果你要听1000次,那么你会做这样的事情:

while(count < 1000) 
{ 
    count++; 
    // Do some thread code. 
} 

这真的取决于你想要的线程,它定义了进入线程的代码是什么,以及如何长时间运行对于。