You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:57:45