iT邦幫忙

0

C#問題一枚,關於CPU使用率

c#
sphinx 2009-08-19 23:53:2411415 瀏覽
  • 分享至 

  • xImage

各位高手:
我要寫一個小程式在伺服器上頭以背景方式執行,程式啟動後,每隔一段時間處理某個作業,我用迴圈去判別經過的等候時間,結果發現在等候時,會造成CPU的使用率滿檔,主程式的寫法如下:
int nextMin = 0; // 程式在整點時啟動
for (int i = 0; i < 5; i++)
{
doJob();
nextMin+=10; // 每十分鐘執行一次
while (DateTime.Now.Minute != nextMin) ; // 等候時CPU使用率=100%
}
不知有何辦法可以讓CPU不要那麼忙?懇請不吝賜教,感激不盡~

看更多先前的討論...收起先前的討論...
pantc328 iT邦高手 1 級 ‧ 2009-08-20 08:44:43 檢舉
1.完全看不到你用背景處理方式.
2.邏輯看起來怪怪的.
my407sw iT邦新手 5 級 ‧ 2009-08-20 10:30:45 檢舉
1. 建議寫成 service,配合timer 類別 在背景執行
2. 也可以參考以上程式碼,使用非同步的方式


class Program
{
static int nextMin = 0;
static IAsyncResult ar;
delegate void jobDelegate();

static void dojob()
{
Console.WriteLine("非同步呼叫....." + nextMin.ToString());
}
static jobDelegate job;
static void jobAsyncCall()
{
job = new jobDelegate(dojob);


AsyncCallback myCallback = new AsyncCallback(myAsyncCallback);
ar = job.BeginInvoke(myAsyncCallback, null);
ar.AsyncWaitHandle.WaitOne();
while (DateTime.Now.Minute != nextMin)
{
Thread.Sleep(3000);
}
}
static void myAsyncCallback(IAsyncResult arr)
{
Console.WriteLine("做完了....");
}
my407sw iT邦新手 5 級 ‧ 2009-08-20 10:30:51 檢舉
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
nextMin += 10;
jobAsyncCall();
}
job.EndInvoke(ar);
}
}
pantc328 iT邦高手 1 級 ‧ 2009-08-20 11:06:11 檢舉
我做的傳真報價作業,每十分鐘去資料庫撈報價資料後再傳出去.
public class FaxServer{
private Thread td;
public FaxServer()
{
ThreadStart ts = new ThreadStart(Run);
td = new Thread(ts);
td.Start();
}
private void Run()
{
do
{
SendFax();
Thread.Sleep(600000);
} while (true);
}
}
sphinx iT邦研究生 3 級 ‧ 2009-08-21 22:48:20 檢舉
哈哈,不好意思,您的寫法太高深了,給他看不懂...^^"

因為我只是初學者,還不會寫service,而且程式不必全天候執行,所以只要寫成一般的console application,再用排程去啟動就好。
sphinx iT邦研究生 3 級 ‧ 2009-08-21 22:53:42 檢舉
我對Thread還不太瞭解,但您的程式如果改寫成這樣:
public FaxServer()
{
do
{
SendFax();
Thread.Sleep(600000);
} while (true);
}
執行效果是否相同?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

12
fillano
iT邦超人 1 級 ‧ 2009-08-20 07:36:28
最佳解答
&lt;pre class="c" name="code">
System.Threading.Thread.CurrentThread.Sleep(60*1000);

我想會比較好。不過.net我不熟,所以你還是測試一下吧。

請參考:
http://msdn.microsoft.com/zh-tw/library/system.threading.thread.sleep.aspx

sphinx iT邦研究生 3 級 ‧ 2009-08-20 08:17:58 檢舉

直接套用您的方法會出現編譯錯誤,後來發現只能用Thread.Sleep(n);
這樣就解決問題了,感謝您提供的線索。

我要發表回答

立即登入回答