對不起了幾分生硬的問題,那很可能有幾十個答案,但我不知道要尋找什麼......的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保持在每個時鐘滴答和彈出工人永遠不會結束。 但是,如果我刪除它,工人得到完成。
如果你幫助你的讀者理解你的「似乎並不忙」的定義,它可能會提高你獲得有用答案的機會。你在測量/測試什麼,當你移除罪魁禍首時,測量/測試如何改變? – 2012-07-14 22:36:38
「工作」是什麼意思?你能指望什麼?你得到了什麼? – usr 2012-07-14 22:42:19
如果你減少了不必要的細節,那麼你的讀者也不會感到不知所措。您是否嘗試過構建一個簡單的測試用例,該測試用例不使用msgqueue(無論該變量是什麼類型),GroupNotice和其他任何不是重現問題所必需的東西? – 2012-07-14 22:44:18