Зачем блокировать networkstream.write? - PullRequest
1 голос
/ 21 августа 2011

У меня есть клиент-серверный проект. У меня проблема с отправкой данных с сервера клиентам.

    private bool SendPack(object client, string data)
    {
        lock (this)
        {
            try
            {
                NetworkStream clientStream = tcpServer.GetStream();

                byte[] Pack= ClsEncryption.GetEncrypt(data);

                clientStream.Write(Pack, 0, Pack.Length);
                clientStream.Flush();

                return true;
            }

            catch
            {                    
                return false;
            }
        }
    }

хотя я использую блокировку, когда запускается команда записи, все разрушается. Я имею в виду ничего не отправлять и запись не возвращается (как блокировка). я должен использовать асинхронные методы, используя beginwrite или нет? Как я могу проверить, готов ли сетевой поток к записи и не будет ли блокироваться. Я использую clienttream.canwrite, но это было бесполезно.

Мне нужен самый быстрый и надежный способ отправки данных. Любая идея?

Ответы [ 2 ]

0 голосов
/ 21 августа 2011

Если есть одновременные операции чтения с этим потоком в другом потоке, и если в операциях чтения используется блокировка для одного и того же экземпляра, потоки, возможно, будут взаимоблокироваться. Если это так, используйте разные экземпляры для блокировки операций чтения и записи или отправьте | читать данные вне оператора блокировки.

0 голосов
/ 21 августа 2011

Согласно документации вы можете использовать свойство CanWrite:

if (clientStream.CanWrite)
{
    clientStream.Write(Pack, 0, Pack.Length);
    clientStream.Flush();
    return true;
}
...