对于一个有点生硬的问题,我很抱歉,可能有几十个答案,但我什至不知道要寻找什么......
我正在使用后台工作人员,出于某种原因,它似乎并不忙。在尝试启动工作程序之前,我正在检查它是否很忙。
我里面的代码如下:
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);
}
}
问题是,为什么这会阻止我的工人忙碌?我一拿出来,它就像一个魅力。不过我需要它,所以我希望任何人都可以帮助我提出导致问题的原因,以及如何在工作人员中正确使用它。
编辑:
我很抱歉错过了“不工作”的关键点..
所以
通过“不工作”,我的意思是 Client.Self.InstantMessage() 不会启动,并且后台工作人员不会忙碌。如前所述,我在进入工人之前先测试工人是否忙:
void MsgTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (!ClientSpam_BgWrkrTimer.IsBusy)
{
Messagebox.Show("Going into BgWrkr!");
ClientSpam_BgWrkrTimer.RunWorkerAsync();
}
}
使用 Client.Self.InstantMessage() 时,消息框会在每个计时器滴答声中不断弹出,并且工作人员永远不会结束。但是,如果我删除它,工人就完成了。