private async Task ResourceHandler(IHtmlNode referenceNode, string attributeName, string localPath, string prefix) { var referenceUri = new Uri(baseUri, referenceNode.Attributes[attributeName].Value); var localReference = Path.Combine(localPath, prefix + referenceUri.ToString().GetHashCode().ToString() + Path.GetExtension(referenceUri.LocalPath.Replace(@"/", @"\"))); referenceNode.Attributes[attributeName].Value = localReference; if (map.TryAdd(referenceUri.ToString(), localReference)) { using (var stream = fileSystem.OpenStreamFor(localReference)) { await loader.DownloadAsync(referenceUri.ToString(), stream); } } }
public async Task DownloadAsync(string uri, Stream stream) { if (Interlocked.Increment(ref threadCount) >= parallelRestrictNumber) { synchronizer.WaitOne(); } try { Interlocked.Increment(ref activeThreadCount); await loader.DownloadAsync(uri, stream); } finally { Interlocked.Decrement(ref activeThreadCount); Interlocked.Decrement(ref threadCount); synchronizer.Set(); } }
public void Initialize() { loader = new LoaderFromResource(); loaderMoq = new Mock <IWebLoader>(); loaderMoq.Setup(m => m.DownloadAsync(It.IsAny <string>(), It.IsAny <Stream>())).Returns <string, Stream>((uri, stream) => loader.DownloadAsync(uri, stream)); fileSystemMoq = new Mock <IFileSystemWrapper>(); fileSystemMoq.Setup(m => m.OpenStreamFor(It.IsAny <string>())).Returns(() => new MemoryStream()); }