1

首先,我正在使用 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 实现这一点?还是我应该尝试别的?

4

1 回答 1

1

由于您已经在构建 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
    }
于 2011-08-23T11:43:48.310 回答