/// <summary> /// This is helper method to create a <see cref="ReadOnlyResettableAsyncLazy{T}"/> which will resolve host name or textual IP address into <see cref="IPAddress"/>. /// The lazy can be resetted using <see cref="ReadOnlyResettableAsyncLazy{T}.Reset"/> method, if it is needed to resolve again (e.g. dns cache modification). /// </summary> /// <param name="addressOrHostName">The host name or textual IP address.</param> /// <param name="addressSelector">The callback to select one address from potentially many addresses. Only used if this <paramref name="addressOrHostName"/> is host name.</param> /// <param name="dnsResolve">The optional callback to perform DNS resolve. If <c>null</c>, then <paramref name="addressSelector"/> will get <c>null</c> as its argument.</param> /// <returns>A new <see cref="ReadOnlyResettableAsyncLazy{T}"/> which will asynchronously </returns> public static ReadOnlyResettableAsyncLazy <IPAddress> CreateAddressOrHostNameResolvingLazy( String addressOrHostName, Func <IPAddress[], IPAddress> addressSelector, Func <String, Task <IPAddress[]> > dnsResolve = null ) { ReadOnlyResettableAsyncLazy <IPAddress> retVal; if (IPAddress.TryParse(addressOrHostName, out var thisAddress)) { retVal = new ReadOnlyResettableAsyncLazy <IPAddress>(() => thisAddress); } else { #if !NETSTANDARD1_3 if (dnsResolve == null) { dnsResolve = (host) => #if NET40 DnsEx #else Dns #endif .GetHostAddressesAsync(host); } #endif retVal = new ReadOnlyResettableAsyncLazy <IPAddress>(async() => { var allIPs = await(dnsResolve?.Invoke(addressOrHostName) ?? #if NET40 TaskEx #else Task #endif .FromResult <IPAddress[]>(null)); IPAddress resolvedAddress = null; if ((allIPs?.Length ?? 0) > 1) { resolvedAddress = addressSelector?.Invoke(allIPs); } if (resolvedAddress == null) { resolvedAddress = allIPs.GetElementOrDefault(0); } return(resolvedAddress); }); } return(retVal); }
public DataRowColumnSUKS( DataColumnMetaData metadata, Int32 thisStreamIndex, ResizableArray <Byte> byteArray, DataRowColumnSUKS[] allDataRowStreams ) : base(metadata, thisStreamIndex) { this.ByteArray = ArgumentValidator.ValidateNotNull(nameof(byteArray), byteArray); this._totalBytesRead = 0; this._byteCount = new ReadOnlyResettableAsyncLazy <Int32>(async() => await this.ReadByteCountAsync()); this._allStreams = ArgumentValidator.ValidateNotEmpty(nameof(allDataRowStreams), allDataRowStreams); this._transitionFunc = async unused => await this.ReadByteCountAsync(); }
/// <summary> /// Initializes a new instance of <see cref="DataColumnSUKS"/> with given parameters. /// </summary> /// <param name="metadata">The column <see cref="DataColumnMetaData"/>.</param> /// <param name="columnIndex">The index of this column in <see cref="AsyncDataRow"/> it was obtained from.</param> /// <param name="previousColumn">The previous <see cref="DataColumnSUKS"/> column of the <see cref="AsyncDataRow"/> this belongs to.</param> /// <exception cref="ArgumentNullException">If <paramref name="metadata"/> is <c>null</c>, or if <paramref name="columnIndex"/> is greater than <c>0</c> but <paramref name="previousColumn"/> is <c>null</c>.</exception> public DataColumnSUKS( DataColumnMetaData metadata, Int32 columnIndex, AsyncDataColumn previousColumn ) : base(metadata, columnIndex) { if (columnIndex > 0) { ArgumentValidator.ValidateNotNull(nameof(previousColumn), previousColumn); } this._totalBytesRead = 0; this._byteCount = new ReadOnlyResettableAsyncLazy <Int32>(async() => { if (previousColumn != null) { await previousColumn.SkipBytesAsync(null); } return(await this.ReadByteCountAsync()); }); }