为什么 base.method() 在 C# 中不调用基 class 方法?

Why base.method() does not calling base class method in C#?

我有一个 class 名为 TCPStream。它继承了 NetworkStream class。 并且 NetworkStream 继承 Stream Class 即

public class TCPStream : NetworkStream, IComparable<TCPStream>
{...}

public class NetworkStream : Stream
{...}

现在,Stream Class 有一个函数 ReadAsync(,,,),并且这个函数也在 TCPStream Class.

中被覆盖

我的问题是:当我在 TCPStream class 中调用 base.ReadAsync(,,,) 时,它会一次又一次地执行自己...(不是调用(父) Stream class 方法...)

因此,由于自调用出现WhosebugException..

我应该怎么做才能完成这个任务? 代码片段在下方

 public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
    {
        try
        {

            // int read_RetryCount = 0;
            // repeat till Complete Packet Received
            TimeSpan timeOutLimit = TimeSpan.MaxValue;
            if (CanTimeout)
                timeOutLimit = DateTime.Now.TimeOfDay + TimeSpan.FromMilliseconds(ReadTimeout);     // maxTimeOutLimit


                **// *** Here is Problem, base.ReadAsync(,,,) Not execute Parent's ReasAsync(,,,)***
                // *** After This Line, Function Execute itself Again..*****

                var length = base.ReadAsync(_localBuffer.Array, _localBuffer.Offset, _localBuffer.Count ).GetAwaiter().GetResult();

                Console.WriteLine("Total Bytes read = " + length);

        }
    }

既然你已经添加了代码,问题就很清楚了:

您有:

public override Task<int> ReadAsync(byte[] buffer, int offset, int count,
    CancellationToken cancellationToken)
{
    ...
     var length = base.ReadAsync(_localBuffer.Array,
         _localBuffer.Offset, _localBuffer.Count ).GetAwaiter().GetResult(); 
}

现在看看ReadAsync(byte[],int,int)的默认实现:

public Task<int> ReadAsync(byte[] buffer, int offset, int count) => 
    this.ReadAsync(buffer, offset, count, CancellationToken.None);

您调用的方法与您覆盖的方法不同 - 您调用了一个非常微妙的不同方法。 问题是您没有传递取消标记。如果您简单地更改为:

 var length = base.ReadAsync(_localBuffer.Array,
     _localBuffer.Offset, _localBuffer.Count, cancellationToken).GetAwaiter().GetResult();

它应该消失了。

但是请注意,您永远不应该像这样使用 .GetAwaiter().GetResult()。更好的解决方案是将 async 修饰符添加到您的方法中,并使用:

 var length = await base.ReadAsync(_localBuffer.Array,
     _localBuffer.Offset, _localBuffer.Count, cancellationToken);

或者,去掉 while(true) 循环 - 它看起来很不对 - 并且 不要 添加 async 修饰符,只需:

return base.ReadAsync(_localBuffer.Array,
     _localBuffer.Offset, _localBuffer.Count, cancellationToken);