2

对于一个有点生硬的问题,我很抱歉,可能有几十个答案,但我什至不知道要寻找什么......

我正在使用后台工作人员,出于某种原因,它似乎并不忙。在尝试启动工作程序之前,我正在检查它是否很忙。

我里面的代码如下:

    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() 时,消息框会在每个计时器滴答声中不断弹出,并且工作人员永远不会结束。但是,如果我删除它,工人就完成了。

4

1 回答 1

0

我注意到Thread.Sleep(2000)您的员工中有一份声明。这将导致 worker 的.IsBusy属性在大约 2 秒内为真,加上在Sleep.

您还提到,当调用到时Client.Self.InstantMessage(...),工作人员永远不会显得忙。对我来说,这似乎Thread.Sleep永远不会执行调用,这意味着该Client.Self.InstantMessage方法很可能正在引发异常。

尝试将调用包装Client.Self.InstantMessage在一个try/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事件)以查看工作人员是否引发了异常。

一旦您知道异常是什么,您将能够更好地诊断问题的原因。

于 2012-07-14T23:49:49.127 回答