为什么 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);
我有一个 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);