私はasp.netmvc-5 Webアプリケーションに取り組んでおりWebClient()
、サードパーティアプリケーションへの連続呼び出しを行うために次の呼び出しがあります。
public async Task<List<Technology>> GetResource(int? filtertype)
{
try
{
using (WebClient wc = new WebClient())
{
string url = currentURL + "resources?AUTHTOKEN=" + token;
var json = await wc.DownloadStringTaskAsync(url);
resourcesinfo = JsonConvert.DeserializeObject<ResourcesInfo>(json);
}
//for each resource get its tag + add the tag to the list
foreach (var c in resourcesinfo.operation.Details)
{
ResourceAccountListInfo resourceAccountListInfo = new ResourceAccountListInfo();
using (WebClient wc = new WebClient())
{
string url = currentURL + "resources/" + c.RESOURCEID + "?AUTHTOKEN=" + token;
string tempurl = url.Trim();
var json = await wc.DownloadStringTaskAsync(tempurl);
resourceAccountListInfo = JsonConvert.DeserializeObject<ResourceAccountListInfo>(json);
AllTags.Add(resourceAccountListInfo.SingleOrDefault().CUSTOMFIELDVALUE.ToLower());
}
}
}
現在、最初の呼び出しはWebClient
約1,500レコードを返すため、WebClient
内の2番目の呼び出しはforeach
1,500回実行されるため、プロセス全体が完了するまでに約20分かかります。では、どうすればこのプロセスを改善できますか?
DownloadStringTaskAsyncの呼び出しを調整する方法が必要です。セマフォとTask.Runを使用して手動で行うか、TPL Dataflowライブラリを使用してすべてのURLをフィードし、必要な制限まで並列度を指定することができます。データフローブロックは非同期デリゲートを受け入れます(Parallel.Forとは異なります)
private static async Task<Thing[]> ProcessAllUrls(string[] urls)
{
var workBlock = new TransformBlock<string, Thing>(
async url => await DownloadAndProcessUrl(url),
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 20 }
);
var outputBlock = new BufferBlock<Thing>();
using (workBlock.LinkTo(outputBlock, new DataflowLinkOptions { PropagateCompletion = true }))
{
foreach (var url in urls)
{
workBlock.Post(url);
}
// signal no more input going into workblock
workBlock.Complete();
// wait for workblock to pump all data into outputblock
await workBlock.Completion;
IList<Thing> finalResult = null;
bool result = outputBlock.TryReceiveAll(out finalResult);
return finalResult.ToArray();
}
}
ただし、Webサーバープロセス内で並列処理を行う場合は注意が必要です。WebClient呼び出しはCPUから完全に非同期ですが、応答を逆シリアル化する作業はスレッドプールスレッドで実行されます。つまり、この間、CPUリソースに対するASP.NET要求と競合しています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加