【问题标题】:NetworkStream BeginRead / EndReadNetworkStream BeginRead / EndRead
【发布时间】:2011-05-22 22:39:45
【问题描述】:

我是 C# 编程的新手,我正在开发一个基于 TcpClient 的应用程序。

我想知道如何使用 BeginRead 和 EndRead,我已经阅读了 MSN 文档但没有帮助。

我有这个:

    private void Send()
    {
        TcpClient _client = new TcpClient("host", 80);
        NetworkStream ns = _client.GetStream();
        ns.Flush();
        / ...
        ns.Write(buffer, 0, buffer.Length);

        int BUFFER_SIZE = 1024;
        byte[] received = new byte[BUFFER_SIZE];
        ns.BeginRead(received, 0, 0, new AsyncCallback(OnBeginRead), ns);
    }

    private void OnBeginRead(IAsyncResult ar)
    {
        NetworkStream ns = (NetworkStream)ar.AsyncState;
        int BUFFER_SIZE = 1024;
        byte[] received = new byte[BUFFER_SIZE];
        string result = String.Empty;

        ns.EndRead(ar);

        int read;
        while (ns.DataAvailable)
        {
            read = ns.Read(received, 0, BUFFER_SIZE);
            result += Encoding.ASCII.GetString(received);
            received = new byte[BUFFER_SIZE];
        }
        result = result.Trim(new char[] { '\0' });
        // Want to update Form here with result
    }

如何使用结果更新表单组件?

感谢您的帮助。

【问题讨论】:

  • 我在这里遇到了同样的问题,我想知道是否可以在您插入评论行以更新表单的位置发起事件。从Form 订阅事件并更新什么?还是在单独的线程中会导致一些问题?谢谢。

标签: c# winforms tcp tcpclient


【解决方案1】:

首先,我建议学习很多关于多线程的知识。然后回来学习套接字。两者都有相当陡峭的学习曲线,尝试同时解决这两个问题很多需要处理。

也就是说,您可以通过TaskScheduler.FromCurrentSynchronizationContext 捕获 UI 上下文并将Task 调度到该TaskScheduler 来发布对 UI 的更新。如果 TPL 不可用,则可以直接使用 SynchronizationContext。

【讨论】:

  • 我已经阅读了有关 SynchronizationContext 的更多信息,并且运行良好,谢谢!将阅读有关两者的更多信息,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多