C# 为什么调试器在异步调用后不在断点处停止?

C# 为什么调试器在异步调用后不在断点处停止?,c#,visual-studio,debugging,asynchronous,C#,Visual Studio,Debugging,Asynchronous,我有两个从同一基本服务继承的服务。两者都进行异步API调用,我正在为其编写测试。我能够按照预期通过一个服务的基本服务调用进行调试。对于第二个服务,在进行异步调用后,调试器不会在任何断点处停止,而是完成执行并退出 以下是两个服务继承的基本服务: namespace MyCoach.Services { public enum Caching { Normal, Forced }; public abstract class BaseService { pro

我有两个从同一基本服务继承的服务。两者都进行异步API调用,我正在为其编写测试。我能够按照预期通过一个服务的基本服务调用进行调试。对于第二个服务,在进行异步调用后,调试器不会在任何断点处停止,而是完成执行并退出

以下是两个服务继承的基本服务:

namespace MyCoach.Services
{
    public enum Caching { Normal, Forced };
    public abstract class BaseService
    {
        protected readonly INetworkManager _networkManager;
        protected readonly IConfigurationService _configurationService;
        protected readonly ISettingsService _settings;
        protected readonly ICacheService _cache;

        public BaseService(INetworkManager networkManager, IConfigurationService configurationService, ISettingsService settingsService, ICacheService cacheService)
        {
            _networkManager = networkManager;
            _configurationService = configurationService;
            _settings = settingsService;
            _cache = cacheService;
        }

        protected void Execute<T>(RestRequest request, Action<T> onSuccess, Action<HttpStatusCode> onFailure) where T : class, new()
        {
            ExecuteAsync(request, onSuccess, onFailure);
        }

        protected async Task ExecuteAsync<T>(RestRequest request, Action<T> onSuccess, Action<HttpStatusCode> onFailure) where T : class
        {
            if (_networkManager.IsConnectionAvailable())
            {
                var restClient = new RestClient(new Uri(_configurationService.Configuration.MyCoachBaseUrl));
                AddImageSetParameter(request);
                try
                {
                    *IRestResponse<T> response = await restClient.Execute<T>(request);
                    if (IsSuccessfulStatusCode(response.StatusCode))
                    {
                        onSuccess(response.Data);
                    }
                    else
                    {
                        onFailure(response.StatusCode);
                    }
                }
                catch (Exception ex)
                {
                    int statusCode = Int32.Parse(ex.Message.Substring(0, 3));
                    onFailure((HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), statusCode));
                }
            }
            else
            {
                _networkManager.ShowNetworkUnavailableError();
            }
        }
    }    
}
在我的服务中,我看到了奇怪的调试器行为:

namespace MyCoach.Services
{
    public interface IPingService
    {
        void PingValidEndpoint(Action<PingResponse> onSuccess, Action<HttpStatusCode> onFailure);
    }

    public class PingService : BaseService, IPingService
    {
        public PingService(INetworkManager networkManager, IConfigurationService configurationService, ISettingsService settingsService, ICacheService cacheService)
            : base(networkManager, configurationService, settingsService, cacheService)
        {
        }

        public void PingValidEndpoint(Action<PingResponse> onSuccess, Action<HttpStatusCode> onFailure)
        {
            var request = RequestBuilder.GET("/ping", version: 2)
                                        .WithAccessToken(_settings)
                                        .Build();
            Execute(request, onSuccess, onFailure);
        }
    }
}
名称空间mycach.Services
{
公共接口IPingService
{
无效PingValidEndpoint(操作成功,操作失败);
}
公共类PingService:BaseService、IPingService
{
公共ping服务(INetworkManager网络管理器、IConfigurationService配置服务、isettings服务设置服务、ICacheService缓存服务)
:base(网络管理器、配置服务、设置服务、缓存服务)
{
}
公共无效PingValidEndpoint(操作成功,操作失败)
{
var request=RequestBuilder.GET(“/ping”,版本:2)
.WithAccessToken(_设置)
.Build();
执行(请求、成功、失败);
}
}
}

导致我在调试器中看到不同行为的这两个服务之间的区别是什么?

根据HomeService和PingService类,它们以相同的方式实现BaseService。因此,问题应该与称呼他们的方式有关。请检查用于调用PingService的代码,确保它使用async并等待调用PingService。详细说明和步骤,请参阅以下文档

您是否已在Visual Studio中启用?如果捕获的消息不包含有效整数,异常处理块本身可能引发异常。另外,
ExecuteAsync
是异步的,但在
Execute
中不等待调用。Async/await应该会在调用堆栈中冒泡(除非您对返回的任务调用
Wait()
,否则使用
Execute
方法实际上没有意义)。出于调试目的,请尝试在
ExecuteAsync
上调用
Wait()
,然后查看弹出的内容
namespace MyCoach.Services
{
    public interface IPingService
    {
        void PingValidEndpoint(Action<PingResponse> onSuccess, Action<HttpStatusCode> onFailure);
    }

    public class PingService : BaseService, IPingService
    {
        public PingService(INetworkManager networkManager, IConfigurationService configurationService, ISettingsService settingsService, ICacheService cacheService)
            : base(networkManager, configurationService, settingsService, cacheService)
        {
        }

        public void PingValidEndpoint(Action<PingResponse> onSuccess, Action<HttpStatusCode> onFailure)
        {
            var request = RequestBuilder.GET("/ping", version: 2)
                                        .WithAccessToken(_settings)
                                        .Build();
            Execute(request, onSuccess, onFailure);
        }
    }
}