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()が起動せず、backgroundworkerが忙しくないことを意味します。前述のように、私はまず、ワーカーに入る前に、ワーカーが忙しいかどうかを確認するためにテストします。

    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)私はあなたがあなたの労働者に声明を持っていることに気づきました。これにより、ワーカーの.IsBusyプロパティが約2秒間真になり、さらに、の前にメソッドで費やされた時間がすべて真になりますSleep

また、への呼び出しClient.Self.InstantMessage(...)が存在する場合、ワーカーはビジー状態に見えることはありません。私には、これはThread.Sleep呼び出しが実行されていないように見えます。つまり、Client.Self.InstantMessageメソッドが例外をスローしている可能性があります。

呼び出しをブロックでラップしてClient.Self.InstantMessagetry/catch例外がスローされているかどうかを確認してください。デバッガーで実行すると、VisualStudioの出力ウィンドウでメッセージを確認できます。

        ...

        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 に答える