C# 捕获WebserviceException后执行HTTPRequest时出现死锁

C# 捕获WebserviceException后执行HTTPRequest时出现死锁,c#,.net,web-services,c#-4.0,C#,.net,Web Services,C# 4.0,在我故意捕获WebServiceException以让我的应用程序继续运行之后,我不知何故出现了死锁/挂起。然而,即使应用程序继续。做一个Web服务挂起,它可能看起来仍然在尝试做前一个调用中的某些事情。 我尝试使用CancellationTokenSource,但这似乎并没有解决我的问题 RetryHandler: public class RetryHandler : DelegatingHandler { private const int MaxRetries = 2;

在我故意捕获WebServiceException以让我的应用程序继续运行之后,我不知何故出现了死锁/挂起。然而,即使应用程序继续。做一个Web服务挂起,它可能看起来仍然在尝试做前一个调用中的某些事情。 我尝试使用CancellationTokenSource,但这似乎并没有解决我的问题

RetryHandler:

public class RetryHandler : DelegatingHandler
{
    private const int MaxRetries = 2;

    public RetryHandler(HttpMessageHandler innerHandler)
        : base(innerHandler)
    {
    }

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        HttpResponseMessage response = null;
        Exception lastException = null;
        for (var i = 0; i < MaxRetries; i++)
        {
            try
            {
                response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                lastException = ex;
            }

            if (IsSuccessful(response))
            {
                return response;
            }
        }

        throw GetException(response, lastException);
    }
公共类RetryHandler:DelegatingHandler
{
private const int MaxRetries=2;
公共RetryHandler(HttpMessageHandler innerHandler)
:base(innerHandler)
{
}
受保护的覆盖异步任务SendAsync(
HttpRequestMessage请求,
取消令牌(取消令牌)
{
HttpResponseMessage响应=null;
异常lastException=null;
对于(变量i=0;i
两次呼叫Post使我的程序挂起:

    public async Task<T> Post<T>(
        string path,
        HttpContent content,
        string username,
        string token,
        HttpMessageHandler handler)
    {
        var client = new HttpClient(new RetryHandler(handler));
        var authString = GetAuthenticationString(username, token);
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authString);
        AddUsernameAndTokenToClientRequestHeader(client, username, token);

        client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", content.Headers.ContentType.MediaType);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));

        var result = await client.PostAsync(new Uri(path), content, _cancelHttpRequests.Token).ConfigureAwait(false);
            var resultContent = result.Content.ReadAsStringAsync().Result;
            return JsonConvert.DeserializeObject<T>(resultContent);        
    }
公共异步任务发布(
字符串路径,
HttpContent内容,
字符串用户名,
字符串标记,
HttpMessageHandler(处理程序)
{
var client=newhttpclient(newretryhandler(handler));
var authString=GetAuthenticationString(用户名、令牌);
client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“基本”,authString);
将用户名和令牌添加到客户端请求标题(客户端、用户名、令牌);
client.DefaultRequestHeaders.TryAddWithoutValidation(“内容类型”,Content.Headers.ContentType.MediaType);
client.DefaultRequestHeaders.Accept.Add(新MediaTypeWithQualityHeaderValue(“*/*”);
var result=await client.PostAsync(新Uri(路径)、内容、\u cancelHttpRequests.Token);
var resultContent=result.Content.ReadAsStringAsync().result;
返回JsonConvert.DeserializeObject(resultContent);
}

这里发生的情况是,尽管您捕获了异常,并假定让您的应用程序继续运行,但服务本身仍然异步地继续工作,因此即使您试图强制服务继续,它仍将继续尝试完成所有所需的操作。

在您的情况下:造成死锁。取消令牌在这里没有帮助,因为您的服务正在运行异步,并且您已经通过捕获异常停止了它,所以,您基本上没有使用该令牌

解决此问题的两种方法:

或者,在出现异常时断开服务,这样会强制关闭服务


或者尝试以同步方式使用您的服务,以便您可以在需要时停止服务,这样可以确保在您停止服务时它不会做任何额外的工作。

这很奇怪…应该在第一次调用
。Result
。检查您是否缺少任何步骤。我想做的是捕获WebServiceException并en取消请求,这样它就不会挂起:哦,伙计,这太糟糕了:(N00b)问题。你有任何代码示例/已知方法来强制关闭服务吗?这是停止所有服务,包括父服务。