C # BackgroundWorker не работает - PullRequest
0 голосов
/ 19 марта 2011

Я пытаюсь заставить этот BackgroundWorker работать.Когда вы нажмете кнопку «Просмотреть заказы», ​​она отобразит сообщение в виде строк «Получение новых заказов ...» и т. Д., И выполнит фоновую работу (запрос MySQL), теперь внутри метода DoWork есть куча вещей, иничего из этого не сделано.

Я знаю, что это не из-за MySQL Query, потому что он прекрасно работает без фонового работника.

Вот код:

private void ViewOrders_Click(object sender, EventArgs e)
        {
            SlideTimer.Enabled = true;
            Alert("Retrieving unconfirmed orders. Please wait.",
                "Cancel",
                Information,
                true,
                Color.FromArgb(63, 187, 249)
            );
            action = Action.ViewOrder;

            bWorker.WorkerSupportsCancellation = true;
            bWorker.DoWork += new DoWorkEventHandler(bWorker_DoWork);
            bWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bWorker_RunWorkerCompleted);

            bWorker.RunWorkerAsync();
        }

        void bWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            SlideTimer.Enabled = true;
            Alert("All unconfirmed orders have been retrieved.",
                "Dismiss",
                Information,
                true,
                Color.FromArgb(63, 187, 249)
            );
            action = Action.None;
        }

        void bWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            // Connect to Database, check for orders, and end.
            if (bWorker.CancellationPending == true)
            {
                e.Cancel = true;
            }
            else
            {
                if (action == Action.ViewOrder)
                {
                    thelist.Clear();
                    thelist.Visible = true;
                    thelist.BringToFront();
                    MessageBox.Show("");
                    thelist.Columns.Add("Order #");
                    thelist.Columns.Add("Name");
                    thelist.Columns.Add("E-mail Address");
                    thelist.Columns.Add("Delivery Address");
                    thelist.Columns.Add("Company");
                    thelist.Columns.Add("Phone Number");

                    // Check for new orders.
                    MySql.Data.MySqlClient.MySqlConnection msc = new MySql.Data.MySqlClient.MySqlConnection(cs);
                    try
                    {
                        msc.Open();

                        // Check for orders now.
                        string st = "SELECT DISTINCT(sessionid), firstname, lastname, email, streetaddress, suburb, postcode, state, company, phone FROM mysql_9269_dbase.order";
                        MySql.Data.MySqlClient.MySqlCommand cd = new MySql.Data.MySqlClient.MySqlCommand(st, msc);
                        MySql.Data.MySqlClient.MySqlDataReader msdr = cd.ExecuteReader();

                        while (msdr.Read())
                        {
                            if (thelist.Items.Count == 0)
                            {
                                ListViewItem LItem = new ListViewItem(msdr[0].ToString());
                                ListViewItem.ListViewSubItemCollection SubItems = new ListViewItem.ListViewSubItemCollection(LItem);

                                SubItems.Add(msdr[1].ToString() + " " + msdr[2].ToString());
                                SubItems.Add(msdr[3].ToString());
                                SubItems.Add(msdr[4].ToString() + " " + msdr[5].ToString() + " " + msdr[6].ToString() + " " + msdr[7]);
                                SubItems.Add(msdr[8].ToString());
                                SubItems.Add(msdr[9].ToString());

                                thelist.Items.Add(LItem);

                                thelist.Update();
                            }
                            else
                            {
                                sound.Play();

                                //status.Text = "Records found; Retrieving now.";
                                var found = false;

                                foreach (var item in thelist.Items)
                                {
                                    if (item.ToString().Contains(msdr[0].ToString()))
                                        found = true;
                                }
                                if (thelist.Items.Count == 0 || !found)
                                {
                                    ListViewItem LItem = new ListViewItem(msdr[0].ToString());
                                    ListViewItem.ListViewSubItemCollection SubItems = new ListViewItem.ListViewSubItemCollection(LItem);

                                    SubItems.Add(msdr[1].ToString() + " " + msdr[2].ToString());
                                    SubItems.Add(msdr[3].ToString());
                                    SubItems.Add(msdr[4].ToString() + " " + msdr[5].ToString() + " " + msdr[6].ToString() + " " + msdr[7]);
                                    SubItems.Add(msdr[8].ToString());
                                    SubItems.Add(msdr[9].ToString());

                                    thelist.Items.Add(LItem);

                                    thelist.Update();
                                }
                            }
                        }
                    }
                    catch (Exception en)
                    {
                        Alert(en.Message,
                            "Retry",
                            Error,
                            true,
                            Color.FromArgb(249, 87, 55)
                        );
                    }
                    msc.Close();

                }
                thelist.Visible = true;
                thelist.BringToFront();
            }
        }

        private void MessageLink_Click(object sender, EventArgs e)
        {
            switch (MessageLink.Text)
            {
                case "Cancel":
                    bWorker.CancelAsync();

                    SlideTimer.Enabled = true;
                    Alert("You have successfully cancelled the current operation.",
                        "Dismiss",
                        Information,
                        true,
                        Color.FromArgb(63, 187, 249)
                    );
                    action = Action.None;
                    break;
                case "":
                    break;
                default:
                    break;
            }
        }

Там нет ошибок или что-нибудь.Просто ничего не происходит.Что заставляет фонового (так называемого) рабочего не DoWork ()?

* Извините за длинный фрагмент кода.

Ответы [ 2 ]

4 голосов
/ 19 марта 2011

Вы подключили обратные вызовы, но на самом деле не вызвали RunWorkerAsync, чтобы запустить его.

Кроме того, вы также вызываете элементы пользовательского интерфейса в методе DoWork, что не удастся.Вам нужно использовать BeginInvoke, чтобы переписать обновления обратно в поток пользовательского интерфейса или выполнить обновления в методе RunWorkerComplete (который запускается в потоке пользовательского интерфейса автоматически).

1 голос
/ 19 марта 2011
MessageBox.Show("");

Это вызовет большую проблему.

Вы не можете вызывать пользовательский интерфейс из потока, не являющегося пользовательским интерфейсом. Я удивлен, что это не вызвало исключения. В лучшем случае это, вероятно, приводит к тому, что ваша нить прерывается и ничего не делает.

theList также выглядит как элемент пользовательского интерфейса. Если вы добавляете в элемент управления, вам нужно передать данные через событие в пользовательский интерфейс, чтобы вы могли обновить его там.

У вас также есть:

Alert(en.Message,
    "Retry",
    Error,
    true,
    Color.FromArgb(249, 87, 55)
);

В вашем обработчике исключений. Опять же, похоже, что вы пытаетесь вызвать элементы пользовательского интерфейса.

...