NuGet官方SDK示例代码遇await阻塞及Logger参数报错,求解决方案
修复NuGet SDK示例代码的两个问题
修复后的完整代码
using NuGet.Common; using NuGet.Configuration; using NuGet.Protocol; using NuGet.Protocol.Core.Types; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { // 使用泛型NullLogger解决参数类型不匹配问题 ILogger<PackageMetadataResource> logger = NullLogger<PackageMetadataResource>.Instance; CancellationToken cancellationToken = CancellationToken.None; SourceCacheContext cache = new SourceCacheContext(); SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json"); // 添加ConfigureAwait(false)避免同步上下文死锁 PackageMetadataResource resource = await repository.GetResourceAsync<PackageMetadataResource>().ConfigureAwait(false); IEnumerable<IPackageSearchMetadata> packages = await resource.GetMetadataAsync( "Newtonsoft.Json", includePrerelease: true, includeUnlisted: false, cache, logger, cancellationToken).ConfigureAwait(false); foreach (IPackageSearchMetadata package in packages) { Console.WriteLine($"Version: {package.Identity.Version}"); Console.WriteLine($"Listed: {package.IsListed}"); Console.WriteLine($"Tags: {package.Tags}"); Console.WriteLine($"Description: {package.Description}"); Console.WriteLine("---"); } } }
问题分析与解决方案
1. GetMetadataAsync方法logger参数报错
- 问题原因:
PackageMetadataResource.GetMetadataAsync方法要求的日志参数是泛型ILogger,而非示例中非泛型的 ILogger,类型不匹配导致编译报错。 - 解决方法:将
NullLogger.Instance替换为NullLogger<PackageMetadataResource>.Instance,确保日志实例类型与方法参数要求一致。
2. await永久阻塞无法完成
- 问题原因:在默认同步上下文(如控制台程序的Main方法)中调用未加
.ConfigureAwait(false)的异步方法,容易引发死锁——异步方法完成后试图回到原同步上下文,但原上下文已被阻塞等待异步结果。 - 解决方法:
- 将控制台程序的
Main方法改为async Task Main(C# 7.1及以上支持),避免同步阻塞异步操作。 - 在每个
await后添加.ConfigureAwait(false),告诉异步方法不需要回到原同步上下文,打破死锁链。
- 将控制台程序的
内容的提问来源于stack exchange,提问作者Victor Tercero
相关产品推荐
相关产品推荐

