この特定のオーバーロードは、複数のタスクをチェーン化しない限り、基本的には役に立ちません。メソッド呼び出しcancellationToken
へのエントリ時にのみチェックされ、基になる呼び出しの実行中はチェックされません。ReadAsync
Stream.BeginRead
ILSpyからダンプされたコード:
public virtual Task<int> ReadAsync(byte[] buffer,
int offset,
int count,
CancellationToken cancellationToken)
{
if (!cancellationToken.IsCancellationRequested)
return this.BeginEndReadAsync(buffer, offset, count);
return Task.FromCancellation<int>(cancellationToken);
}
ご覧のとおり、は通話にcancellationToken
転送されず、次の観点から実装されているだけです。BeginEndReadAsync
BeginEndReadAsync
Stream.BeginRead
private Task<int> BeginEndReadAsync(byte[] buffer, int offset, int count)
{
return TaskFactory<int>.FromAsyncTrim<Stream, Stream.ReadWriteParameters>(
this,
new Stream.ReadWriteParameters
{
Buffer = buffer,
Offset = offset,
Count = count
},
(Stream stream, Stream.ReadWriteParameters args, AsyncCallback callback, object state) =>
stream.BeginRead(args.Buffer, args.Offset, args.Count, callback, state),
(Stream stream, IAsyncResult asyncResult) =>
stream.EndRead(asyncResult)
);
}
この時点で保証されるのは、派生したストリームタイプによって作成されたものだけであり、タイプごとに異なります。
これは現在の.Net4.5ビットに基づいており、実装はもちろん将来変更される可能性があることに注意してください。