コード例 #1
0
        /// <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);
        }
コード例 #2
0
ファイル: DataRow.Stream.cs プロジェクト: stazz/CBAM
 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();
 }
コード例 #3
0
        /// <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());
            });
        }