我一直试图在c#中使用后台工作者来帮助我使用MSMQ程序。
当程序加载时,它会创建一个名为bgwMSMQ的新后台工作程序。
到目前为止,我的代码是:
private void btnSendMsg_Click(object sender, EventArgs e)
{
if (bgwMSMQ.IsBusy != true)
{
btnAbort.Enabled = true;
btnSendMsg.Enabled = false;
bgwMSMQ.RunWorkerAsync();
}
}
private void btnAbort_Click(object sender, EventArgs e)
{
if (bgwMSMQ.WorkerSupportsCancellation == true)
{
btnAbort.Enabled = false;
btnSendMsg.Enabled = true;
bgwMSMQ.CancelAsync();
}
}
这些是我的按钮
private void bgwMSMQ_DoWork(object sender, DoWorkEventArgs e)
{
/*txtPrevTiming.Invoke((MethodInvoker)delegate
{
txtPrevTiming.Text = txtTiming.Text;
});*/
txtPrevTiming.Text = txtTiming.Text;
ClearResponse();
SendMessage(prepareMsg(txtMsgSent.Text), true, true);
}
是Do Work Code。该程序的目标是创建一个后台进程,用于发送和接收MSMQ消息。到目前为止,它的工作原理是我可以发送消息,如果它完成发送,接收周期就没有问题。
但是我需要说明,如果按下中止按钮时没有返回消息,它将停止收听响应消息,而不是等待超时。
当我点击中止时它没有取消操作它发送取消它的请求,我仍然停留在循环中并等待响应消息超时。
任何想法是如何做到这一点,以便中止按钮将取消听取响应消息的操作并停止后台工作者?
由于
try
{
int iObjId = (ObjectId.Length == 0) ? 0 : Convert.ToInt32(ObjectId);
msgSend.Label = createLabel();
//
msgSend.BodyType = (int)VarEnum.VT_BSTR;
msgSend.Body = SentMsg;
//
//sentMsg.BodyStream = new MemoryStream(Encoding.UTF8.GetBytes(SentMsg));
mqRequest.Send(msgSend);
Stopwatch.Restart();
String strMsgId = msgSend.Id;
CorrelationId = msgSend.Id;
if (!bGetResponse)
{
return true;
}
if (!getAnswer(ref mqResponse, CorrelationId, true))
{
if (!getError(ref mqError, CorrelationId, true))
{
showError("Could not retrieve Response or Error");
return false;
}
}
}
catch (System.Exception ex)
{
//showError.Invoke((Action<string>)delegate
//{
showError(String.Format("Error \"{0}\" occurred when trying to send a message", ex.Message));
//});
return false;
}
是send函数,关闭发送消息并调用GetAnsewr来调用RecieveByCorrelationID