Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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# Mono NetworkStream可以';不读取数据_C#_.net_Mono_Networkstream - Fatal编程技术网

C# Mono NetworkStream可以';不读取数据

C# Mono NetworkStream可以';不读取数据,c#,.net,mono,networkstream,C#,.net,Mono,Networkstream,我有一些C#代码可以在Windows上正常工作,但我不能让它在Mono框架上工作 我正在使用最后一个Mono 3.x分支。我知道它不稳定,但我很好奇会发生什么,为什么NetworkStream总是在DataAvailable上返回false,并且我完全确定有数据(在Win上同时测试) 下面是一些从网络流读取的代码: public static class NetworkStreamHelper { /// <summary> /// Asynchronously re

我有一些C#代码可以在Windows上正常工作,但我不能让它在Mono框架上工作

我正在使用最后一个Mono 3.x分支。我知道它不稳定,但我很好奇会发生什么,为什么NetworkStream总是在DataAvailable上返回false,并且我完全确定有数据(在Win上同时测试)

下面是一些从网络流读取的代码:

public static class NetworkStreamHelper
{
    /// <summary>
    /// Asynchronously reads a byte array from the NetworkStream object.
    /// </summary>
    /// <param name="stream">The NetworkStream object to read.</param>
    /// <param name="count">The byte array size to read.</param>
    /// <param name="dataChunkSize">The data chunk size that used for reading chunks from the stream.</param>
    /// <returns>Returns a task presents the asynchronious array read operation.</returns>
    public static async Task<Byte[]> ReadBytesAsync(this NetworkStream stream, Int32 count, Int32 dataChunkSize = 512)
    {
        if (count <= 0)
        {
            throw new ArgumentException("count should not be less 1");
        }
        if (dataChunkSize <= 0)
        {
            throw new ArgumentException("dataChunkSize should not be less 1");
        }

        var dataChunk = new Byte[dataChunkSize];
        var destination = new List<Byte>(count);
        var currentBytesRead = 0;
        var remainedBytesToRead = count;
        var bytesToRead = 0;
        var done = false;

        while (!done)
        {
            bytesToRead = remainedBytesToRead > dataChunk.Length ? dataChunk.Length : remainedBytesToRead;
            if (stream.DataAvailable) 
            {
                currentBytesRead = await stream.ReadAsync (dataChunk, 0, bytesToRead);
            } 
            else 
            {
                Console.WriteLine("delay");
                await Task.Delay(10);
                continue;
            }

            if (currentBytesRead == 0)
            {
                continue;
            }

            destination.AddRange(dataChunk.Take(currentBytesRead));
            remainedBytesToRead -= currentBytesRead;
            done = remainedBytesToRead == 0;
        }

        return destination.ToArray();
    }
}
公共静态类NetworkStreamHelper
{
/// 
///从NetworkStream对象异步读取字节数组。
/// 
///要读取的NetworkStream对象。
///要读取的字节数组大小。
///用于从流中读取数据块的数据块大小。
///返回表示异步数组读取操作的任务。
公共静态异步任务ReadByteAsync(此NetworkStream流,Int32计数,Int32 dataChunkSize=512)
{

如果(count很久以前就解决了。服务器断开了与某个ip地址范围的连接。

您的意思是
DataAvailable
总是
false
,还是只是第一次通过循环?另外,您不需要
DataAvailable
(或
任务延迟
)这里。是的。它总是错误的。如果我没有检查DataAvailable就读取,我总是得到一个AggregationException,带有内部异常IOException:EndRead failure。它在Win上没有任何DataAvailable检查的情况下正常工作。听起来像是
IOException
是核心问题。是否有内部异常详细信息?堆栈中似乎有两个异常种族:异常:EndRead失败和异常:连接被对等方重置。你能添加一些上下文吗?这是Mono错误吗?在哪个版本?