<.> Gleichzeitig im .NET -E/A -Betrieb
eingeschränkt asynchrones Programmieren bietet einen erheblichen Vorteil für parallele Aufgaben. Das Verwalten der Parallelität dieser asynchronen Operationen ist jedoch wichtig, um die Überlastung des Systems zu vermeiden. In diesem Artikel werden gemeinsame Probleme erörtert, die die Anzahl der E/A -Operationen einschränken, um die Anzahl der E/A -Operationen einzuschränken, um die beste Leistung zu gewährleisten.
<:> Frage:
mangelt es in Abwesenheit der Verwendung von asynchronen HTTP -Anfragen, um mehrere URLs zu erhalten, das Standardverhalten besteht darin, eine große Anzahl gleichzeitiger Anfragen zu erstellen. Dies kann zu Erschöpfung der Ressourcen und zur Leistungsrückgang führen. Die Herausforderung besteht darin, die Parallelität auf den angegebenen Schwellenwert zu begrenzen, z. B. 20 Anfragen gleichzeitig.
Lösung:
.NET 4.5 Beta führte ein asynchrones Signalvolumen (SemaphoresLIM) ein, das eine effektive Methode zur Steuerung des gleichzeitigen Zugriffs zu Ressourcen darstellte. Mit der Waitasync () -Methode können wir die Ausführung der zuvor suspendierten asynchronen Methode vor der angegebenen Anzahl von Slots suspendieren. Beispielcode:
In diesem Code stellt die Waitasync () -Methode nur 20 Anforderungen gleichzeitig sicher. Wenn eine neue Anfrage arrangiert ist, warten Sie, bis ein Rille verfügbar ist. Eine alternative Lösung zur Verwendung der Aufgabenplanung:
<code class="language-csharp">public async Task MyOuterMethod() { // 要获取的 URL 列表 string[] urls = { "http://google.com", "http://yahoo.com", ... }; // 创建一个节流器,将并发性限制为 20 个请求 SemaphoreSlim throttler = new SemaphoreSlim(initialCount: 20); // 初始化一个列表以存储所有异步任务 var allTasks = new List<Task>(); // 安排每个 URL 获取任务 foreach (var url in urls) { // 等待节流器中的一个槽可用 await throttler.WaitAsync(); // 在单独的线程池流中安排任务 allTasks.Add( Task.Run(async () => { try { using (var client = new HttpClient()) // 使用using语句确保HttpClient被正确释放 { var html = await client.GetStringAsync(url); } } finally { // 释放节流器中的槽 throttler.Release(); } })); } // 等待所有任务完成 await Task.WhenAll(allTasks); }</code>
Eine andere Methode beinhaltet die Verwendung der TPL -basierten Zeitplanung zur Erstellung in Auftragsbindungsaufgaben. Anschließend können Sie einen benutzerdefinierten Aufgabenplaner implementieren, um die Ausführung von gleichzeitigen Beschränkungen zu erzwingen. Weitere Informationen finden Sie unter Beispiele für TaskScheduler auf MSDN.
Das obige ist der detaillierte Inhalt vonWie kann ich gleichzeitige asynchronisierte E/A -Operationen in .NET einschränken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!