この関数をライブラリで作成しました。私は、コンソールとWPFの両方のアプリケーションにこの機能を使用します。私のコンソールアプリケーションでは、この機能は1秒もかからずに完了し、最大80個のアイテムと小さなコレクションなどの大量収集が可能です。 5.WPFで非同期関数を高速化する方法
さらに、私のWPFアプリケーションでは、アイテムのコレクションを80個まで実行すると、実行を終了するのに1分以上かかりますが、5個までのアイテムは1秒未満で終了します。
C#コード:
public async Task<Dictionary<string, string[]>> GetTemplates(string showName)
{
Dictionary<string, string[]> d = new Dictionary<string, string[]>();
// Get element collection uri of show "DemoShow"
var elementCollectionUriTask = Task.Run(() => GetElementCollectionUri(vizServiceDocURL, showName));
var elementCollectionUri = await elementCollectionUriTask;
var templateCollectionUriTask = Task.Run(() => GetTemplateCollectionUri(elementCollectionUri));
var templateCollectionUri = await templateCollectionUriTask;
var templateNamesTask = Task.Run(() => GetListOfTemplateName(templateCollectionUri));
var templateNames = await templateNamesTask;
//get the name and links from each show and add them to the dictionary
foreach (string templateName in templateNames)
{
var templateCollectionEntryUriTask = Task.Run(() => GetTemplateCollectionEntryUri(templateCollectionUri, templateName));
var templateCollectionEntryUri = await templateCollectionEntryUriTask;
var elementModelUriTask = Task.Run(() => GetTemplateElementModelUri(templateCollectionUri, templateName));
var elementModelUri = await elementModelUriTask;
await Task.Run(() => PrintVdfModel(elementModelUri));
string[] links = new string[2] { templateCollectionEntryUri, elementModelUri };
d.Add(templateName, links);
}
return d;
}
あなたが作業中にメソッド呼び出しをスピンアップし、主に同期とシーケンシャルに見える方法のために必要以上のオーバーヘッドが追加され、すぐにそれらを待っている、タスクで実行すると、物事をスピードアップしようとしていることを考えています。あなたのforeachループは、タスクとしてタスクをスピンアップさせ、リストにそれらのタスクを追加して、ループの外側で 'await Task.WhenAll(listOfTasks); 'ですべて待機するか、** Parallel.ForEach'を使用することができます** **ブロック操作**。 – ColinM
@ColinMに同意すると、スレッドプール上で最大80 * 2の本質的に連続した操作をスケジュールしています。それらはお互いに待たなければならない可能性が高い場所です。順番に作業をするか、待っている同期メソッドの真の非同期バージョンを書くだけです。 – Clay