在c#中使用后台工作程序

时间:2013-11-22 10:27:13

标签: c# backgroundworker msmq

我一直试图在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

0 个答案:

没有答案