首先,我正在使用 Visual Studio 10 并编写 Windows Forms App。我对 C# 中的线程没有经验。
我有一个 C# 应用程序,它使用我的 C# DLL 来侦听网络流,并解析它接收到的数据。解析后的数据用于插入/更新绑定到位于主窗体上的 DataGridView 的 Datatable 的行。
我首先使用在 DLL 中启动的工作线程进行了尝试。绑定到 DataGridView 的 DataTable 作为参数传递给 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 运行应用程序。几秒钟后,UI 变得无响应,它开始填充网格。
我用谷歌搜索了这个,发现我应该使用 BeginInvoke 来防止 UI 冻结。但我没有成功实施。
我尝试了类似的东西
TCPListener Listener = new TCPListener(ListenThread);
IAsyncResult result = Listener.BeginInvoke(null, null);
代替
Thread m_tidListen = new Thread(new ThreadStart(ListenThread));
但它的工作方式相同。仍然不适用于“无调试模式”。
我应该如何使用 BeginInvoke 实现这一点?还是我应该尝试别的?