BackgroundWorker
スレッドを使用して、メッセージがMSMQキューに到着するとすぐにMSMQからメッセージを受信します(メッセージは5秒ごとにmsmqに送られます)。これはスレッドBackgroundWorker
を使用しています。以下は私のWin Formクラスです。私はスレッドに新しいですので、私が何か間違っている場合はappologyをしてくださいBackgroundWorkerスレッドがwinformsを停止していません。C#
問題:私のアプリケーションは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();
}
}
はい、私は)(backgroundworker.cancelasyncを言ってみましたが、これは助けdoestフォームを閉じています。あなたは正しいですそれは参照がいくつか生きている、どのように私はそれを停止することができます...まだ努力しているかわからない – Shax