@@ -66,16 +66,8 @@ public static void ReadFully(Stream stream, byte[] buffer, int offset, int count
66
66
}
67
67
}
68
68
69
- /// <summary>
70
- /// Read as much data as possible from a <see cref="Stream"/>", up to the requested number of bytes
71
- /// </summary>
72
- /// <param name="stream">The stream to read data from.</param>
73
- /// <param name="buffer">The buffer to store data in.</param>
74
- /// <param name="offset">The offset at which to begin storing data.</param>
75
- /// <param name="count">The number of bytes of data to store.</param>
76
- /// <exception cref="ArgumentNullException">Required parameter is null</exception>
77
- /// <exception cref="ArgumentOutOfRangeException"><paramref name="offset"/> and or <paramref name="count"/> are invalid.</exception>
78
- public static int ReadRequestedBytes ( Stream stream , byte [ ] buffer , int offset , int count )
69
+ // A helper function to share between the async and sync versions of ReadRequestedBytes
70
+ private static void ValidateArgumentsForRead ( Stream stream , byte [ ] buffer , int offset , int count )
79
71
{
80
72
if ( stream == null )
81
73
{
@@ -97,7 +89,23 @@ public static int ReadRequestedBytes(Stream stream, byte[] buffer, int offset, i
97
89
{
98
90
throw new ArgumentOutOfRangeException ( nameof ( count ) ) ;
99
91
}
92
+ }
100
93
94
+ /// <summary>
95
+ /// Read as much data as possible from a <see cref="Stream"/>", up to the requested number of bytes
96
+ /// </summary>
97
+ /// <param name="stream">The stream to read data from.</param>
98
+ /// <param name="buffer">The buffer to store data in.</param>
99
+ /// <param name="offset">The offset at which to begin storing data.</param>
100
+ /// <param name="count">The number of bytes of data to store.</param>
101
+ /// <exception cref="ArgumentNullException">Required parameter is null</exception>
102
+ /// <exception cref="ArgumentOutOfRangeException"><paramref name="offset"/> and or <paramref name="count"/> are invalid.</exception>
103
+ public static int ReadRequestedBytes ( Stream stream , byte [ ] buffer , int offset , int count )
104
+ {
105
+ // Common validation function
106
+ ValidateArgumentsForRead ( stream , buffer , offset , count ) ;
107
+
108
+ // read the data using Read
101
109
int totalReadCount = 0 ;
102
110
while ( count > 0 )
103
111
{
@@ -114,6 +122,38 @@ public static int ReadRequestedBytes(Stream stream, byte[] buffer, int offset, i
114
122
return totalReadCount ;
115
123
}
116
124
125
+ /// <summary>
126
+ /// Read as much data as possible from a <see cref="Stream"/>", up to the requested number of bytes
127
+ /// </summary>
128
+ /// <param name="stream">The stream to read data from.</param>
129
+ /// <param name="buffer">The buffer to store data in.</param>
130
+ /// <param name="offset">The offset at which to begin storing data.</param>
131
+ /// <param name="count">The number of bytes of data to store.</param>
132
+ /// <param name="cancellationToken">The token to monitor for cancellation requests.</param>
133
+ /// <exception cref="ArgumentNullException">Required parameter is null</exception>
134
+ /// <exception cref="ArgumentOutOfRangeException"><paramref name="offset"/> and or <paramref name="count"/> are invalid.</exception>
135
+ public static async Task < int > ReadRequestedBytesAsync ( Stream stream , byte [ ] buffer , int offset , int count , CancellationToken cancellationToken )
136
+ {
137
+ // Common validation function
138
+ ValidateArgumentsForRead ( stream , buffer , offset , count ) ;
139
+
140
+ // read the data using ReadAsync
141
+ int totalReadCount = 0 ;
142
+ while ( count > 0 )
143
+ {
144
+ int readCount = await stream . ReadAsync ( buffer , offset , count , cancellationToken ) . ConfigureAwait ( false ) ;
145
+ if ( readCount <= 0 )
146
+ {
147
+ break ;
148
+ }
149
+ offset += readCount ;
150
+ count -= readCount ;
151
+ totalReadCount += readCount ;
152
+ }
153
+
154
+ return totalReadCount ;
155
+ }
156
+
117
157
/// <summary>
118
158
/// Copy the contents of one <see cref="Stream"/> to another.
119
159
/// </summary>
0 commit comments