2012-07-14 64 views
2

對不起了幾分生硬的問題,那很可能有幾十個答案,但我不知道要尋找什麼......的BackgroundWorker不忙

我使用的是後臺工作,並出於某種原因,它似乎並不忙碌。 在嘗試啓動工作人員之前,我正在檢查它是否忙碌。

我在它裏面的代碼是follwoing:

void ClientMsg_BgWrkrTimer_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker ClientMsg_BgWrkrTimer = sender as BackgroundWorker; 
     string current = msgqueue.Last().Key; 
     if (msgqueue.Last().Value.t_Type == 0 || msgqueue.Last().Value.t_Type == 1) 
     { 
      TimedMsgIcon.Enabled = true; 
      foreach (KeyValuePair<string, UUID> g in Msgqueue.Last().Value.t_ngroups) 
      { 
       GroupNotice ntc = new GroupNotice(); 
       ntc.Subject = Msgqueue.Last().Value.t_nmsg; 
       ntc.Message = Msgqueue.Last().Value.t_nmsg; 
       ntc.OwnerID = Client.Self.AgentID; 
       UUID key = UUID.Zero; 
       if (UUID.TryParse(Msgqueue.Last().Value.t_attach.ToString(), out key)) 
       { 
        ntc.AttachmentID = key; 
       } 
       Client.Self.InstantMessage(Client.Self.Name, g.Value, ntc.Subject + "|" 
        + ntc.Message, UUID.Zero, InstantMessageDialog.GroupNotice, 
        InstantMessageOnline.Online, Vector3.Zero, UUID.Zero, 
        ntc.SerializeAttachment()); 
       Thread.Sleep(2000); 
      } 
     } 
    } 

我已經縮小的罪魁禍首是這一個:

Client.Self.InstantMessage(Client.Self.Name, g.Value, ntc.Subject + "|" 
     + ntc.Message, UUID.Zero, InstantMessageDialog.GroupNotice, 
     InstantMessageOnline.Online, Vector3.Zero, UUID.Zero, 
     ntc.SerializeAttachment()); 

而且最有可能它被序列化,這是本(來自我使用的庫):

public struct GroupNotice 
    { 
     /// <summary></summary> 
     public string Subject; 
     /// <summary></summary> 
     public string Message; 
     /// <summary></summary> 
     public UUID AttachmentID; 
     /// <summary></summary> 
     public UUID OwnerID; 

     /// <summary> 
     /// 
     /// </summary> 
     /// <returns></returns> 
     public byte[] SerializeAttachment() 
     { 
      if (OwnerID == UUID.Zero || AttachmentID == UUID.Zero) 
       return Utils.EmptyBytes; 

      OpenMetaverse.StructuredData.OSDMap att = new OpenMetaverse.StructuredData.OSDMap(); 
      att.Add("item_id", OpenMetaverse.StructuredData.OSD.FromUUID(AttachmentID)); 
      att.Add("owner_id", OpenMetaverse.StructuredData.OSD.FromUUID(OwnerID)); 

      return OpenMetaverse.StructuredData.OSDParser.SerializeLLSDXmlBytes(att); 
     } 
    } 

問題是,爲什麼這會阻止m工作人員不忙嗎? 只要我把它拿出來,它就像一個魅力。 雖然我需要它,所以我希望任何人都可以幫助我提出造成問題的原因,以及如何在工人中正確使用它。

編輯:

我是錯過了「不工作」的重要點抱歉..

所以

通過「不工作」,我指的是Client.Self.InstantMessage ()不會觸發,而背景工作者不會得到bussy。 如前所述,我考第一,看看工人忙或沒有進入前工人:

void MsgTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     if (!ClientSpam_BgWrkrTimer.IsBusy) 
     { 
      Messagebox.Show("Going into BgWrkr!"); 
      ClientSpam_BgWrkrTimer.RunWorkerAsync(); 
     } 
    } 

當使用Client.Self.InstantMessage(),在MessageBox保持在每個時鐘滴答和彈出工人永遠不會結束。 但是,如果我刪除它,工人得到完成。

+1

如果你幫助你的讀者理解你的「似乎並不忙」的定義,它可能會提高你獲得有用答案的機會。你在測量/測試什麼,當你移除罪魁禍首時,測量/測試如何改變? – 2012-07-14 22:36:38

+0

「工作」是什麼意思?你能指望什麼?你得到了什麼? – usr 2012-07-14 22:42:19

+0

如果你減少了不必要的細節,那麼你的讀者也不會感到不知所措。您是否嘗試過構建一個簡單的測試用例,該測試用例不使用msgqueue(無論該變量是什麼類型),GroupNotice和其他任何不是重現問題所必需的東西? – 2012-07-14 22:44:18

回答

0

我注意到你的工人有一個Thread.Sleep(2000)聲明。這會導致工作人員的.IsBusy屬性在約2秒內爲真,再加上Sleep之前的方法花費的時間。

您還提到,當存在對Client.Self.InstantMessage(...)的呼叫時,工作人員不會顯得很忙。對我來說,這看起來好像Thread.Sleep調用永遠不會執行,這意味着Client.Self.InstantMessage方法可能會拋出異常。

嘗試將呼叫轉到Client.Self.InstantMessagetry/catch塊中,查看是否拋出了異常。在調試器中運行時,您將能夠在Visual Studio輸出窗口中觀察消息。

 ... 

     try 
     {  
      Client.Self.InstantMessage(Client.Self.Name, g.Value, ntc.Subject + "|" 
       + ntc.Message, UUID.Zero, InstantMessageDialog.GroupNotice, 
       InstantMessageOnline.Online, Vector3.Zero, UUID.Zero, 
       ntc.SerializeAttachment()); 
     } 
     catch(Exception e) 
     { 
      Debug.WriteLine("Exception while calling InstantMessage: {0}", e.ToString()); 
     } 

     Thread.Sleep(2000); 

     ... 

您還可以檢查RunWorkerCompletedEventArgs.Error屬性(從BackgroundWorker.RunWorkerCompleted事件),看看如果工人拋出異常。

一旦您知道例外情況,您將能夠更好地診斷問題的原因。

+1

我可以發誓大約半小時前我發現了這個......但顯然不是。謝謝了很多,我不知道爲什麼我沒有想到在try/catch塊中捕獲錯誤。我在代碼的其他地方使用它。現在我收到了錯誤信息,只是想知道如何解決這個問題,因爲它實際上是在對附件進行序列化。但我最終會到達那裏:) – Rickard 2012-07-15 01:51:08