やや率直な質問で申し訳ありません。おそらく数十の答えがあるかもしれませんが、何を探すべきかさえわかりません...
私はバックグラウンドワーカーを使用していますが、何らかの理由で忙しくないようです。ワーカーを起動する前に、ビジーかどうかを確認しています。
その中にあるコードは次のとおりです。
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()を使用すると、タイマーティックごとにメッセージボックスがポップアップし続け、ワーカーが終了することはありません。しかし、それを削除すると、ワーカーは完了します。