【发布时间】:2011-12-18 00:45:37
【问题描述】:
我正在使用BackgroundWorker 线程调用一个小例程,该例程在消息到达 MSMQ 队列后立即从 MSMQ 接收消息(消息每 5 秒到达 msmq)它来到我使用 @987654322 的应用程序@ 线。下面是我的 Win Form 课程。我是线程新手,所以如果我做错了什么请道歉
问题:我的应用程序是 MDI 应用程序,当我第一次执行我的应用程序时,它工作得非常好,并且一旦它进入队列就会收到 MSMQ 消息,每 5 秒一次,但是当我关闭这个表单时是一个子窗体,它关闭得很好,但是在打开同一个窗体后,我正在接收来自 MSMQ 的消息,时间为 10 秒,所以这意味着我在后台工作线程中搞砸了一些东西,我试图取消这个后台工作线程但是我失败了,无法正确取消或终止线程。请帮助并分享您的经验。下面是我的表单代码。
public partial class FrmBooking : BookingManager.Core.BaseForm.BaseForm
{
internal const string queName = @"messageServer\private$\Response";
private Int32 counter = 0;
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
public FrmBooking()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.ProgressChanged+=new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
backgroundWorker1.DoWork+=new DoWorkEventHandler(backgroundWorker1_DoWork);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bgWorker = sender as BackgroundWorker;
if (bgWorker.CancellationPending)
{
e.Cancel = true;
return;
}
try
{
MessageQueue messageQueue = null;
if (MessageQueue.Exists(queName))
{
messageQueue = new MessageQueue(queName);
}
else
{
MessageQueue.Create(queName);
}
messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });
System.Messaging.Message msg = messageQueue.Receive();
bgWorker.ReportProgress(100, msg);
}
catch (Exception ex) { }
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!e.Cancelled)
{
backgroundWorker1.RunWorkerAsync();
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
System.Messaging.Message msg = e.UserState as System.Messaging.Message;
listBoxControl1.Items.Add(msg.Body.ToString());
counter++;
labelControl1.Text = String.Format("Total messages received {0}", counter.ToString());
}
private void FrmBooking_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
}
【问题讨论】:
标签: c# winforms multithreading backgroundworker