2013-03-08 60 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. 
} 

這真的取決於你想要的線程,它定義了進入線程的代碼是什麼,以及如何長時間運行對於。