Прежде всего, я использую 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?Или я должен попробовать что-то еще?