newbie1992 Ответов: 1

Как добавить новую панель в форму после нарезания резьбы?


я использую метод потоковой передачи при создании команды sql
чтобы предотвратить замораживание моего основного приложения
но когда я пытаюсь добавить новую панель после успешного подключения к серверу
но я вызвал ошибку :
операция перекрестной резьбы недопустима..

я прочитал несколько статей из google Многие люди говорили что это не лучший способ добавить какой либо пользовательский элемент управления с помощью threading

поэтому я попробовал другой метод
1-й прервите мой поток, как вы можете видеть в openConnection, LoadConnection.Прервать (); - это должное.
после того как я прервал его я попробовал этот метод
if (loadConnection.IsAlive) {  }
            else{
                
                if (connectionStatus == "connectionSucceed") { }
                else if (connectionStatus == "connectionFail") {
                    var panel = new Panel(){ new size(100,100), location (0,0);}
                }
            }


но на этот раз ничего не произошло.

есть ли какой-либо способ добавить любой пользовательский элемент управления в основную форму во время выполнения команды sql без замораживания пользовательского интерфейса??

Что я уже пробовал:

using System.Threading;
using MySql.Data.MySqlClient;

namespace databaseCommand{
    public static class mainCommand {
        private static Thread loadConnection = new Thread(new ThreadStart(openConnection));
        private static MySqlConnection con;
        private static string connectionStatus;

        public static void startConnection() {
            loadConnection.Start();
        }

        private static void openConnection() {
            con = new MySqlConnection("server=localhost;user=root;database=bookbardatabase;port=3306;password=");
            try{
                con.Open();
                //connectionStatus = "connectionSucceed";
                //conStatus = "Connected to server";
            }
            catch (Exception ex){
                //connectionStatus = "connectionFail";
                //conStatus = ex.ToString();
                var panel = new Panel(){ new size(100,100), location (0,0);}
            }
            //loadConnection.Abort();
        }
    }
}

1 Ответов

Рейтинг:
4

Dave Kreskowiak

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

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

Это зависит от вызывающего кода, чтобы выяснить, что делать с результатом, либо отобразить его, показать сообщение об ошибке, или что-то еще.


newbie1992

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

Dave Kreskowiak

Да

newbie1992

спасибо Дэйву, я наконец-то решил эту проблему.. спасибо за ваш совет