我遇到了一個問題,管理.NET 4.0 C#上的線程,而且我的線程知識還不足以解決它,所以我在這裏發佈它期望有人可以給我一些建議請。處理多線程的線程
的情況如下:
我們有C#4.0框架Windows服務:(1)通過插座連接到服務器以獲得.PCM文件,(2),然後將其轉換爲一個.WAV文件,(3)通過電子郵件發送 - SMTP,最後(4)通知初始服務器它已成功發送。
已安裝服務的服務器有8個處理器和8 GB或RAM。
爲了允許多處理我已經用4個線程構建了服務,它們中的每一個都執行前面提到的每個任務。
在代碼中,我對每個任務的類和方法,所以我創建線程和調用方法如下:
Thread eachThread = new Thread(object.PerformTask);
裏面每一個方法我有一個檢查一個而如果的連接套接字處於活動狀態,並根據其porpuse繼續獲取數據或處理數據。
while (_socket.Connected){
//perform task
}
的問題是,由於正在安裝更多的服務(相同的Windows服務被複制和兩個端點之間所指向的服務器通過插座來獲取文件上)的CPU消耗急劇增加,每個服務繼續運行,處理文件,但有一段時間CPU消耗太高,服務器崩潰。
問題是:你會建議我如何處理這種情況,我的意思是一般而言,處理這種高度要求的處理任務以避免服務器在CPU消耗中崩潰的好方法是什麼?
謝謝。
PS .:如果有人需要關於該場景的更多細節,請告訴我。
編輯1
隨着CPU崩潰我的意思是服務器過於緩慢,我們不得不重新啓動它。
編輯2
我在這裏張貼代碼的某些部分,所以你可以得到它是如何編程的想法:
while(true){
//starting the service
try
{
IPEndPoint endPoint = conn.SettingConnection();
string id = _objProp.Parametros.IdApp;
using (socket = conn.Connect(endPoint))
{
while (!socket.Connected)
{
_log.SetLog("INFO", "Conectando socket...");
socket = conn.Connect(endPoint);
//if the connection failed, wait 5 seconds for a new try.
if (!socket.Connected)
{
Thread.Sleep(5000);
}
}
proInThread = new Thread(proIn.ThreadRun);
conInThread = new Thread(conIn.ThreadRun);
conOutThread = new Thread(conOut.ThreadRun);
proInThread.Start();
conInThread.Start();
conOutThread.Start();
proInThread.Join();
conInThread.Join();
conOutThread.Join();
}
}
}
編輯3
主題1
while(_socket。連接) { 嘗試 { } var conn = new AppConection(ref _objPropiedades);
try { string message = conn.ReceiveMessage(_socket); lock (((ICollection)_queue).SyncRoot) { _queue.Enqueue(message); _syncEvents.NewItemEvent.Set(); _syncEvents.NewResetEvent.Set(); } lock (((ICollection)_total_rec).SyncRoot) { _total_rec.Add("1"); } } catch (SocketException ex) { //log exception } catch (IndexOutOfRangeException ex) { //log exception } catch (Exception ex) { //log exception } //message received } catch (Exception ex) { //logging error } } //release ANY instance that could be using memory _socket.Dispose(); log = null;
線程2
而(_socket.Connected) { 嘗試{ _syncEvents.NewItemEventOut.WaitOne();
if (_socket.Connected) { lock (((ICollection)_queue).SyncRoot) { total_queue = _queue.Count(); } int i = 0; while (i < total_queue) { //EMail Emails; string mail = ""; lock (((ICollection)_queue).SyncRoot) { mail = _queue.Dequeue(); i = i + 1; } try { conn.SendMessage(_socket, mail); _syncEvents.NewResetEvent.Set(); } catch (SocketException ex) { //log exception } } } else { //log exception _syncEvents.NewAbortEvent.Set(); Thread.CurrentThread.Abort(); } } catch (InvalidOperationException e) { //log exception } catch (Exception e) { //log exception } } //release ANY instance that could be using memory _socket.Dispose(); conn = null; log = null;
線程3
而(_socket.Connected) {
int total_queue = 0; try { _syncEvents.NewItemEvent.WaitOne(); lock (((ICollection) _queue).SyncRoot) { total_queue = _queue.Count(); } int i = 0; while (i < total_queue) { if (mgthreads.GetThreatdAct() <
mgthreads.GetMaxThread()){ 字符串消息= 「」; 鎖(((ICollection的)_queue).SyncRoot) {
message = _queue.Dequeue(); i = i + 1; } count++; lock (((ICollection) _queueO).SyncRoot) { app.SetParameters(_socket, _id,
消息,_queueO,_syncEvents, _total_Env,_total_err); }
Thread producerThread = new
螺紋(app.ThreadJob){名稱= 「ProducerThread_」 + DateTime.Now.ToString( 「ddMMyyyyhhmmss」), 優先級= ThreadPriority.AboveNormal }; producerThread.Start();
producerThread.Join(); mgthreads.IncThreatdAct(producerThread); } mgthreads.DecThreatdAct(); } mgthreads.DecThreatdAct(); } catch (InvalidOperationException e) { } catch (Exception e) { } Thread.Sleep(500); } //release ANY instance that could be using memory _socket.Dispose(); app = null; log = null; mgthreads = null;
螺紋4
MessageVO mesVo = fac.ParseMessageXml(_message);
你能定義「服務器CPU消耗崩潰」嗎? – Olaf 2011-05-23 17:24:39
你能定義你的意思嗎?「問題在於隨着更多服務的安裝」。這是否意味着更多的線程正在運行或更多的進程?線程如何確定要執行的任務? – usr 2011-05-23 17:32:08
你可以定義多少「更多」。你的大部分線程聽起來像是對我的串行操作,還是你在一個服務中處理了很多? – sra 2011-05-23 17:41:39