2011-01-31 75 views
1

我使用背景工人在我的應用後臺輔助線程問題

我的代碼爲這個

void CreateThreadForEachServer() 
{ 
    DataAccess oDA = new DataAccess(); 

    List<Server> allServerData = oDA.GetAllServers(); 

    foreach (Server serverData in allServerData) 
    { 
     backgroundWorker = new BackgroundWorker(); 

     backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork); 

     backgroundWorker.RunWorkerAsync(serverData); 

    } 
} 

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Server server = (Server)e.Argument; 
    CreateSnapshotForEachServer(server); 
} 

void CreateSnapshotForEachServer(Server server) 
{ 
    DataAccess oDA = new DataAccess(); 
    MsmqMessageFormat message = new MsmqMessageFormat(); 

    try 
    { 
     message = new Queue().ReadMessageFromMSMQ(server.ServerName); 
    } 
    catch 
    { 
    } 
} 

我的問題是,當我在後臺工作調用此方法

try 
{ 
    message = new Queue().ReadMessageFromMSMQ(server.ServerName); 
} 
catch 
{ 
} 

那麼我不能夠稱這種方法只是從MSMQ讀取消息

但是,當我不要使用後臺工作只是調用這個方法在簡單的線程這樣

void CreateThreadForEachServer() 
{ 
    DataAccess oDA = new DataAccess(); 

    List<Server> allServerData = oDA.GetAllServers(); 

    foreach (Server serverData in allServerData) 
    { 
     ThreadStart t = delegate { CreateSnapshotForEachServer(serverData); }; 
     Thread td = new Thread(t);     
     td.Priority = ThreadPriority.Highest; 
     td.Start(); 
    } 
} 

,則此方法調用中正確

try 
{ 
    message = new Queue().ReadMessageFromMSMQ(server.ServerName); 
} 
catch 
{ 
} 

什麼是後臺工作的問題,我的Queue類是這個樣子

class Queue 
{ 
    public MsmqMessageFormat ReadMessageFromMSMQ(string queueName) 
    { 
     MessageQueue messageQueue = null; 

     messageQueue = new MessageQueue(@".\Private$\" + queueName); 

     messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(MsmqMessageFormat) }); 

     System.Messaging.Message msg = null; 
     System.Messaging.Message[] allMessages = messageQueue.GetAllMessages(); 

     if (allMessages.Length > 0) 
     { 
      msg = messageQueue.Receive(); 

      MsmqMessageFormat readMessage = (MsmqMessageFormat)(msg.Body); 

      return readMessage; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

和MsmqMessageFormat類是這樣

[Serializable] 
public class MsmqMessageFormat 
{  
    public Zvol Zvol { get; set;} 
    public List<PolicyInterval> listPolicyIntervalInfo = new List<PolicyInterval>(); 
} 
+5

擺脫那隻蒼蠅空的捕捉塊,以便您可以診斷問題。發佈異常的堆棧跟蹤如果沒有幫助。 – 2011-01-31 13:38:58

+0

你有什麼實際的問題。 – CodingBarfield 2011-01-31 13:49:50

回答

1

您能澄清您的應用程序的上下文嗎?

它是Windows窗體應用程序嗎?控制檯應用?還是WPF?

它可能與線程的房屋狀態有關。 BackgroundWorker使用的線程默認爲MTA(並且不能覆蓋它)。手動創建的線程可能會將那裏的apartmentstate設置爲STA。

0

我不確定你的方法是否正確..我會逐一讀取消息並綁定適當的事件。

從鏈接:

消息循環

在上述 示例中的最後一行是 「queue.BeginReceive()」。這是一個 成功的關鍵線 實施Microsoft消息 隊列因爲它提供了手段 連續偵聽在 消息隊列。每收到一條消息 ,監聽過程就會停止。 這有助於提供線程安全的 環境。但是,這也意味着 這是開發者的責任, 繼續收聽隊列。

Using the Microsoft Message Queue MSMQ and C#

你在你的問題有代碼的最後位

另外:

if (allMessages.Length > 0) 
     { 

      msg = messageQueue.Receive(); 

      MsmqMessageFormat readMessage = (MsmqMessageFormat)(msg.Body); 


      return readMessage; 
     } 
     else 
     { 
      return null; 
     } 

這將讓所有的消息和使用他們,但只會即使返回的第一條消息出現在隊列中不止一個。