本文强调了限制并发异步操作的重要性,这反过来又提高了性能。
考虑一个示例,其中用户希望在方法中异步加载数据,它突出显示了开发人员常犯的错误
(async item => await ProcessItem(item));
/// <summary>
/// Old approach with classic async await
/// </summary>
/// <returns></returns>
public async static Task OldApproach(List<string> items)
{
var tasks = items.Select(async item => await ProcessItem(item));
await Task.WhenAll(tasks);
}
该方法可能看起来简洁明了,但它同时为集合中的每个项目启动任务。这可能会导致系统承受重压,从而产生较差的应用程序性能。List<string> items
让我们转换上面的方法,用于限制并发异步操作的数量。以下代码片段演示了更精细的方法。SemaphoreSlim
/// <summary>
/// Optimized approach with limit concurrency
/// </summary>
/// <returns></returns>
public static async Task OptimizedApproachAsync(List<string> items, int maxConcurrency = 10)
{
using (var semaphore = new SemaphoreSlim(maxConcurrency))
{
var tasks = items.Select(async item =>
{
await semaphore.WaitAsync(); // Limit concurrency by waiting for the semaphore.
try
{
await ProcessItem(item);
}
finally
{
semaphore.Release(); // Release the semaphore to allow other operations.
}
});
await Task.WhenAll(tasks);
}
}
上述代码可防止系统因过多的并发任务而窒息。
请在下面找到最佳实践
为了平衡系统负载和资源,建议使用SemaphoreSlim
避免使用 OR,因为它们会导致死锁并降低性能。.Result.Wait()
避免混合异步和同步代码,确保所有方法从上到下都是异步的,以防止死锁并充分利用资源。
C# 中的异步编程不仅涉及理解 and 关键字;它需要更多的功能,如并发性、资源利用率和代码结构asyncawait
源代码获取:公众号回复消息【code:27858
】