фоновый работник против событий - PullRequest
0 голосов
/ 29 марта 2012

Я использую мое приложение Winform для отправки буфера пакетов на мою сетевую карту, мое приложение показывается для выполнения через индикатор выполнения, если я выбираю отправку всего буфера без задержки между пакетами, в которых мое приложение застряло (становится серым) и вернуться к нормальному поведению только после отправки всего буфера (в случае, если мой буфер очень большой, что-то вроде> 50000 пакетов) так как я могу иметь дело с таким делом? Может быть, поменять фонового работника, который проверяет все мои свойства класса (количество отправленных пакетов и т. д.) с событием?

    listBoxFiles.SetSelected(0, true);
    bgWoSingle = new BackgroundWorker();
    bgWoSingle.WorkerReportsProgress = true;
    bgWoSingle.ProgressChanged += new ProgressChangedEventHandler(bgW_ProgressChanged);
    bgWoSingle.DoWork += new DoWorkEventHandler(
    (s3, e3) =>
    {
        while (loopsCount < numberOfLoops && bContinuePlay && ifContinue)
        {
            for (int i = 0; (i < listBoxFiles.Items.Count) && bContinuePlay && ifContinue; i++)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    lbCurrentFileNum.Text = "(" + (i + 1) + "/" + listBoxFiles.Items.Count + "):";
                });

                string path = (string)listBoxFiles.Items[i];
                pcap = new Pcap(path, playSpeed, isSync);
                pcap._startTimer += new EventHandler(pcap_packetStartTimer);
                pcap._stopTimer += new EventHandler(pcap__packetStopTimer);
                pcap.evePacketProgress += new Pcap.dlgPacketProgress(
                    (progressCount) =>
                    {
                        pcap._fileSelectedIndex = i;
                        bgWoSingle.ReportProgress(progressCount, pcap);
                    });

                if (selectedAdapter != null)
                {
                    //play the file
                    bContinuePlay = pcap.playCapture(selectedAdapter._packetDevice);                     }
            }

            loopsCount++;
        }

    bgWoSingle.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        (s3, e3) =>
        {

        }
        );

    bgWoSingle.RunWorkerAsync();

здесь я проверяю свойства класса (имя класса - pcap):

void bgW_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //check the properties and update the UI
    labelPacketSent.Text = pcap._numberOfSendPackets.ToString("#,##0"); 
    progressBar1.Value = e.ProgressPercentage;
}

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Вы должны использовать BackGroundWorker для этого. Я добавляю небольшой пример для этого.

private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
      backgroundWorker.ReportProgress(80, 15000);
}

private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
     var numberOfPackets = int.parse(e.UserState);

     MessageBox.Show("Percentage: " + e.ProgressPercentage );
     MessageBox.Show("Packets sent :" + numberOfPackets);  
}

Рабочий может отправить процент выполнения или любые другие данные, которые вы хотите через UserState.

0 голосов
/ 29 марта 2012

Здесь лучше использовать BackgroundWorker. Это новое и лучше, чем определение пользовательских событий для обновления вашего индикатора выполнения. Проверьте MSDN .

0 голосов
/ 29 марта 2012

Идея состоит в том, чтобы иметь класс PacketSender, который использует BGWorker и регистрируется в его событиях Progress и т. Д., И имеет собственное свойство прогресса или события для разрешения привязки / прослушивания.

Затем класс PacketSender получит какую-то большую задачу и позволит это сделать BGWorker. Ваш метод BGWorker-Work будет находиться в отдельном потоке, и каждый раз, когда вы вызываете ReportProgress из него, вы будете получать его в своем методе прослушивания в PacketSender в основном потоке и сможете передавать его вверх слушателям PacketSender.ProgressChanged. или измените свойство ProgressChanged процентов завершенных и т. д.

Правильный способ сделать это - получить данные для задачи в ctor-пакете PacketSender и немедленно запустить BGWorker, чтобы предотвратить одновременное выполнение нескольких задач на одном PacketSender, или использовать метод Start и Stop, который будет проверять, BGWorker работает и предотвратит многозадачность одного PacketSender.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...