Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TCP服务器ReadAsync值然后EndRead_C#_Multithreading_Asynchronous_Tcpserver - Fatal编程技术网

C# TCP服务器ReadAsync值然后EndRead

C# TCP服务器ReadAsync值然后EndRead,c#,multithreading,asynchronous,tcpserver,C#,Multithreading,Asynchronous,Tcpserver,通常我可以在本网站或其他网站、文档中找到asnwer。但现在我无法忍受。。。 我有两个版本的TCP服务器代码(NetworkSteam read) 使用ReadAsync: public async Task StartWorkAsync(TcpClient Modem, CancellationToken ct) { using (Modem) { byte[] buf = new byte

通常我可以在本网站或其他网站、文档中找到asnwer。但现在我无法忍受。。。 我有两个版本的TCP服务器代码(NetworkSteam read)

使用ReadAsync:

public async Task StartWorkAsync(TcpClient Modem, CancellationToken ct)
        {
            using (Modem)
            {
                    byte[] buf = new byte[1024];
                    var steam = Modem.GetStream();
                    while (!ct.IsCancellationRequested && !StopAllWorkFoClients.WaitOne(0))
                    {
                        var amountReadTask = steam.ReadAsync(buf, 0, buf.Length, ct);
                        var amountRead = await amountReadTask.ConfigureAwait(false);

                        if (amountReadTask.IsFaulted || amountReadTask.IsCanceled)
                        {
                            Console.WriteLine("Error:IsFaulted||IsCanceled");
                            break;
                        }
                        await WorkOnReceiveModemData(buf.Take(amountRead).ToArray()).ConfigureAwait(false);
                    }
            }
        }
以开头,以结尾:

        byte[] buf = new byte[1024];
        public void StartWork(TcpClient Modem)
        {
            var steam = Modem.GetStream();
            var x = steam.BeginRead(buf, 0, buf.Length, new AsyncCallback(ReceiveDataAsync), (object)steam);
        }

        public void ReceiveDataAsync(IAsyncResult ar)
        {
            try
            {
                NetworkStream x = (NetworkStream)ar.AsyncState;//(((Tuple<object,object>)ar.AsyncState).Item1);

                try
                {
                    bytesread += x.EndRead(ar);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                var timeout = 0;
                var bytesbefore = bytesread;
                x.ReadTimeout = 50;
                while (bytesread < _BYTESBUFFERCOUNT)
                {
                    DateTime dt = DateTime.Now;
                    if (x.DataAvailable)
                    {
                        var ii = x.Read(bufzzzz, bytesread, bufzzzz.Length - bytesread);
                        bytesread += ii;
                    }

                    System.Threading.Thread.Sleep(10);

                    if (bytesread - bytesbefore > 0)
                        timeout = 0;
                    else
                    {
                        timeout += (int)(DateTime.Now - dt).TotalMilliseconds;
                    }
                    if (bytesread > 5)
                        if (timeout > _ACCUMULATETIMEOUT)
                            break;

                    if (bytesread <= 5)
                        if (timeout > _ACCUMULATETIMEOUT * 2)
                            break;

                    bytesbefore = bytesread;
                }
                WorkOnReceiveModemData(buf.Take(bytesread).ToArray());

                x.BeginRead(buf, bytesread, buf.Length, new AsyncCallback(ReceiveDataAsync), (object)x);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
byte[]buf=新字节[1024];
公用无效启动网络(TCP客户端调制解调器)
{
var steam=Modem.GetStream();
var x=steam.BeginRead(buf,0,buf.Length,新的异步回调(ReceiveDataAsync),(对象)steam);
}
public void ReceiveDataAsync(IAsyncResult ar)
{
尝试
{
NetworkStream x=(NetworkStream)ar.AsyncState;/((元组)ar.AsyncState).Item1);
尝试
{
字节读取+=x.EndRead(ar);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
var超时=0;
var bytesbefore=字节读取;
x、 ReadTimeout=50;
while(字节读取<_字节缓冲计数)
{
DateTime dt=DateTime.Now;
如果(x.DataAvailable)
{
变量ii=x.Read(bufzzz、bytesread、bufzzz.Length-bytesread);
bytesread+=ii;
}
系统线程线程睡眠(10);
if(字节读取-字节之前>0)
超时=0;
其他的
{
timeout+=(int)(DateTime.Now-dt).total毫秒;
}
如果(字节读取>5)
如果(超时>\u累计超时)
打破
if(字节读取_累加时间输出*2)
打破
bytesbefore=bytesread;
}
工作接收模式数据(buf.Take(bytesread.ToArray());
x、 BeginRead(buf,bytesread,buf.Length,new AsyncCallback(ReceiveDataAsync),(object)x);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
也许我犯了错误,但在第二个版本中它是这样写的(对的): 0x00 0x10 0x3F 0xFF 0x00 0x00 0xFD 0xFC

但第一个版本是:

读取:0x00 0x10 0x3F 0xFF 0x00 0x00 0xFD 0xFC 0x00 0x10 0x3F 0xFF 0x00 0x00 0xFD 0xFC

或:

读取:0x10 0x3F 0xFF 0x00 0x00 0xFD 0xFC

读取:0x00 0x10 0x3F 0xFF 0x00 0x00 0xFD 0xFC

读取:0x00 0x10 0x3F 0xFF 0x00 0x00 0xFD 0xFC


我的客户是不同的GPRS调制解调器。我希望smb能帮助我。

对不起。它是同等工作的,但我认为ReadAsync更快、更清晰。我在其他代码中有错误,我每次发送两次数据包到GPRS调制解调器,并且调制解调器使编译两个答案在一个


在开始时,我不得不使用不同的服务器,当我在(BeginRead,EndRead)上更改ReadAsync时,我看到了相同的错误。我不知道为什么,但ReadAsync版本的服务器多次读取此数据包。但在BeginRead中,服务器读取包和网络流的EndRead版本是干净的,正在等待我的请求包。