Я использую фона рабочего для прослушивания UDP, а затем выполняю обработку. Я хочу, чтобы выйти, когда я нажимаю на button2C# Фоновый работник не выходит
public snmpmain()
{
InitializeComponent();
backsnmp = new BackgroundWorker();
backsnmp.DoWork += new DoWorkEventHandler(backsnmp_DoWork);
backsnmp.ProgressChanged += new ProgressChangedEventHandler
(backsnmp_ProgressChanged);
backsnmp.WorkerReportsProgress = true;
_startsnmp = true;
backsnmp.WorkerSupportsCancellation = true;
}
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
this.backsnmp.RunWorkerAsync();
}
private void button2_Click(object sender, EventArgs e)
/* it executes this when button2 is pressed but nothing happens. I can receive the UDP packets the dowork hasn't stopped*/
{
_startsnmp = false;
backsnmp.CancelAsync();
listBox1.Items.Add("SNMP Stopped");
}
void backsnmp_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
listBox1.Items.Add (e.UserState as String);
}
void backsnmp_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
listBox1.Items.Add("SNMP Stopped");
button2.Enabled = false;
button1.Enabled = true;
}
}
void backsnmp_DoWork(object sender, DoWorkEventArgs e)
{
backsnmp.ReportProgress(0, "Initializing SNMP Listener on Port:" + port + "...");
UdpClient listener = new UdpClient(port);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, port);
while (true)
{
if (backsnmp.CancellationPending)
{
e.Cancel = true;
return;
}
Thread.Sleep(100);
backsnmp.ReportProgress(0, "Waiting for messages....");
packet = listener.Receive(ref groupEP); // When I press button2 it's right here
// do some work here
Он идет и выполняет button2_Click, когда я нажимаю на button2, но ничего не происходит. Гордость не отменяется. Я все еще могу получить пакеты.
Возможный дубликат [C# отмены DoWork рабочего фонаря] (http://stackoverflow.com/questions/826096/c-sharp-cancelling-dowork-of-background-worker) – wudzik
@wudzik: но это не действительно предлагаю как прервать без использования abortablebackgrounder – user726720
, если вам нужно udp async, тогда вы должны использовать ['UdpClient.BeginReceive()'] (http://msdn.microsoft.com/en-us/library/system.net.sockets .udpclient.beginreceive.aspx) вместо рабочего. – Oliver