TCP-клиент для заполнения DataTable, который заполняет связанный DataGridView, пользовательский интерфейс не отвечает - PullRequest
1 голос
/ 23 августа 2011

Прежде всего, я использую Visual Studio 10 и кодирую приложение Windows Forms.У меня нет опыта работы с потоками в C #.

У меня есть приложение на C #, которое использует мою C # DLL, которая прослушивает сетевой поток и анализирует полученные данные.Проанализированные данные используются для вставки / обновления строк таблицы данных, которая связана с DataGridView, расположенным в главной форме.

Сначала я попробовал это с рабочим потоком, который запускается внутри DLL.DataTable, который связан с DataGridView, передается в качестве параметра в DLL.И тогда поток начинается.Функция потока была примерно такой:

private void ListenThread()

    {
        Thread.CurrentThread.CurrentCulture =
            System.Globalization.CultureInfo.InvariantCulture;
        while (m_Active)
        {
            Thread.Sleep(100);
            int lData = m_Stream.Read(m_Buffer, 0,
                  m_Client.ReceiveBufferSize);
            String myString = Encoding.UTF7.GetString(m_Buffer);
            myString = myString.Substring(0, lData);
            ParseString(myString);

        }
    }

Метод ParseString () анализирует данные и вставляет строку в DataTable или обновляет существующие.

Этот код работал хорошо,пока я не попытался запустить приложение с помощью CTRL + F5 вместо F5.Пользовательский интерфейс перестал отвечать на запросы, через несколько секунд он начал заполнять сетку.

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

Я пробовал что-то вроде

TCPListener Listener = new TCPListener(ListenThread);
IAsyncResult result = Listener.BeginInvoke(null, null);

вместо

Thread m_tidListen = new Thread(new ThreadStart(ListenThread));

, но это работало так же.Все еще не работает с "без режима отладки".

Как мне реализовать это с BeginInvoke?Или я должен попробовать что-то еще?

1 Ответ

1 голос
/ 23 августа 2011

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

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        //do your time consuming stuff
        while (m_Active)
        {
            Thread.Sleep(100);
            int lData = m_Stream.Read(m_Buffer, 0,
                  m_Client.ReceiveBufferSize);
            String myString = Encoding.UTF7.GetString(m_Buffer);
            e.result = myString.Substring(0, lData);

            ParseString(e.Result.ToString());
        }

    }

 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //update your UI if needed
    }
...