Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用RESTAPI超时_C#_Rest - Fatal编程技术网

C# 使用RESTAPI超时

C# 使用RESTAPI超时,c#,rest,C#,Rest,调用REST服务时如何处理超时问题。 我的GetAsync函数: private async Task<string> GetAsync(string endPoint, string id) { using (var httpClient = new HttpClient()) { SevenMResultNx<string> result = new SevenMResultNx<strin

调用REST服务时如何处理超时问题。 我的GetAsync函数:

    private async Task<string> GetAsync(string endPoint, string id)
    {
        using (var httpClient = new HttpClient())
        {
            SevenMResultNx<string> result = new SevenMResultNx<string>(false);

            httpClient.BaseAddress = new Uri(baseAddress);
            httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(token);

            // HTTP GET
            HttpResponseMessage response = await httpClient.GetAsync(String.Format("{0}/{1}", endPoint, id));
            if (response.IsSuccessStatusCode)
            {
                return await response.Content.ReadAsStringAsync();
            }
            else
            {
                return response.ReasonPhrase;
            }
        }
    }
私有异步任务GetAsync(字符串端点,字符串id) { 使用(var httpClient=new httpClient()) { SevenMResultNx结果=新的SevenMResultNx(假); httpClient.BaseAddress=新Uri(BaseAddress); httpClient.DefaultRequestHeaders.Accept.Add(新的System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(“应用程序/json”)); httpClient.DefaultRequestHeaders.Authorization=新系统.Net.Http.Headers.AuthenticationHeaderValue(令牌); //HTTP获取 HttpResponseMessageResponse=等待httpClient.GetAsync(String.Format(“{0}/{1}”,端点,id)); if(响应。IsSuccessStatusCode) { return wait response.Content.ReadAsStringAsync(); } 其他的 { 返回response.reason短语; } } } 这被称为:

        Task<string> task = GetAsync(endPoint, id);
        var responseGet = task.Result;
Task Task=GetAsync(端点,id);
var responseGet=task.Result;

每当端点不可用时,我都会遇到问题,因为进程会无限等待

我建议让您的方法接受
CancellationToken
,然后您可以将其传递到
GetAsync
ReadAsStringAsync
方法

您可以轻松创建取消令牌,该令牌将在特定时间后过期:

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
var text = await GetAsync(endpoint, id, cts.Token);
此外,在调用者中使用
Result
几乎肯定是一个错误。这意味着,如果您使用的调度程序只有一个线程,则会死锁-您的线程将等待任务完成,但无法完成,因为当
httpClient.GetAsync
调用完成时,它需要在同一线程中执行更多代码。两项改进:

  • 在等待任务的
    GetAsync
    方法中,使用
    ConfigureAwait(false)
    ,因为您可能不关心异步方法的其余部分在哪个线程上继续
  • 同时使调用代码异步,并等待返回的任务

我建议让您的方法接受一个
CancellationToken
,然后您可以将它传递到
GetAsync
ReadAsStringAsync
方法

您可以轻松创建取消令牌,该令牌将在特定时间后过期:

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
var text = await GetAsync(endpoint, id, cts.Token);
此外,在调用者中使用
Result
几乎肯定是一个错误。这意味着,如果您使用的调度程序只有一个线程,则会死锁-您的线程将等待任务完成,但无法完成,因为当
httpClient.GetAsync
调用完成时,它需要在同一线程中执行更多代码。两项改进:

  • 在等待任务的
    GetAsync
    方法中,使用
    ConfigureAwait(false)
    ,因为您可能不关心异步方法的其余部分在哪个线程上继续
  • 同时使调用代码异步,并等待返回的任务

不适合我。也许我调用task的方式有错误。@iljon:你不应该这样使用
task.Result
——我没有发现。在几乎所有情况下,您都应该使用
wait
。但是我们无法判断您是否正确地传递了
CancellationToken
——我已经稍微修改了我的答案,因为我没有看到
ReadAsStringAsync
调用。我将编辑答案,包括使用wait。这对我不起作用。也许我调用task的方式有错误。@iljon:你不应该这样使用
task.Result
——我没有发现。在几乎所有情况下,您都应该使用
wait
。但是我们无法判断您是否正确地传递了
CancellationToken
——我已经稍微修改了我的答案,因为我没有看到
ReadAsStringAsync
调用。我将编辑答案,包括使用wait。