2013-07-10 3 views
0

Я использую фона рабочего для прослушивания 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, но ничего не происходит. Гордость не отменяется. Я все еще могу получить пакеты.

+0

Возможный дубликат [C# отмены DoWork рабочего фонаря] (http://stackoverflow.com/questions/826096/c-sharp-cancelling-dowork-of-background-worker) – wudzik

+0

@wudzik: но это не действительно предлагаю как прервать без использования abortablebackgrounder – user726720

+1

, если вам нужно udp async, тогда вы должны использовать ['UdpClient.BeginReceive()'] (http://msdn.microsoft.com/en-us/library/system.net.sockets .udpclient.beginreceive.aspx) вместо рабочего. – Oliver

ответ

3

listener.Receive блокируется до получения данных. Следовательно, ваша отмена не признается вообще.

Что вы можете сделать, это либо использовать BeginReceive (и избавиться от BackgroundWorker), либо попытаться сделать поле класса и утилизировать его при отмене. Тем не менее последний должен оставить блокирующий прием с исключением. Хорошо - или отправьте сообщение слушателю самостоятельно после отмены (что, очевидно, также пробудит приемник).

+0

Основываясь на ваших рекомендациях, я изменил его на BeginReceive. Можете ли вы, пожалуйста, посоветуйте сейчас. Как мне реализовать остановку начала приема, так как она находится в отдельном потоке asycnch. – user726720

+0

Утилизируйте UDPClient и поймайте исключение в обратном вызове от EndReceive. – JeffRSon

+0

Утилизация будет выполняться в кнопке управления и как я поймаю исключение. Не могли бы вы дать мне короткий пример. Я в замешательстве. Я очень ценю вашу помощь – user726720

Смежные вопросы