【问题标题】:TCP Client through multithreading in C#TCP客户端通过C#中的多线程
【发布时间】:2015-04-05 09:49:21
【问题描述】:

我正在使用 TCP 客户端连接到 Gmail 帐户以阅读电子邮件。它为 TCP 连接返回 SslStream。它适用于单线程环境,但在速度方面性能非常差。

我需要优化项目以提高其速度。我已经实现了多线程,这提高了速度,但应用程序在某些时候会挂起。

使用 TCP 连接(全局成员)是否线程安全?

或者我可以创建多个 TCP 连接并传递给线程方法以提高速度吗?

或者还有其他更好的方法吗?

TCPClient m_TCPclient
SslStream sslStream;

private void createTCP()
{
// creating tcp and sslstream
}

private void authenticateUser()
{
// authenticating the user
}

private void getUserdata()
{

// iterating folders and its items
foreach(string emailID in IDList)
{
//Thread implementation

}

【问题讨论】:

    标签: c# tcpclient gmail-imap sslstream


    【解决方案1】:

    关于线程安全,请快速浏览TcpClientSslStream 的文档:

    此类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。

    我认为您可能想要查看的是使用流的异步方法来处理执行 IO 时的挂起。

    【讨论】:

      【解决方案2】:

      TCPClient 和 SslStream 对象都不是线程安全的。您必须添加线程同步以避免竞争条件以避免挂起。但是,您的应用程序速度仍将取决于单个 tcp 客户端,这实质上会使您的多线程在 tcp 吞吐量方面毫无用处。

      让每个线程创建自己的连接和流对象。这反过来会增加您的 tcp 吞吐量,这很可能是您的应用程序的瓶颈。

      要同步线程以使它们不会读取相同的信息,请让主线程获取电子邮件列表并将电子邮件列表的子集传递给每个线程,这些线程又使用自己的连接来获取这些电子邮件。

      您还可以使用缓存来避免每次重新启动应用程序时获取相同的信息。

      【讨论】:

        猜你喜欢
        • 2012-09-26
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多