C# 任务方法返回捕获到的TaskCanceledException

C# 任务方法返回捕获到的TaskCanceledException,c#,wpf,async-await,C#,Wpf,Async Await,我正在尝试调用一个服务,该服务应该返回所有记录,但我收到一个TaskCancelledException,其中包含一条消息,即Task已取消,然后结果为空。我知道有很多数据(尝试使用小数据,效果很好)。我如何才能使它继续工作(保持抓取记录),而不抛出“任务已取消”。这是我的方法 public async Task<ActionResult<string>> ObtainData(string url, CancellationToken ct = default(Canc

我正在尝试调用一个服务,该服务应该返回所有记录,但我收到一个TaskCancelledException,其中包含一条消息,即Task已取消,然后结果为空。我知道有很多数据(尝试使用小数据,效果很好)。我如何才能使它继续工作(保持抓取记录),而不抛出“任务已取消”。这是我的方法

public async Task<ActionResult<string>> ObtainData(string url, CancellationToken ct = default(CancellationToken))
{            
    Result<string> result = new Result<string>();
    try
    {
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
        HttpResponseMessage response = await httpClient.SendAsync(request); //HttpClient

        string jsonresult = await HandleReceipt(response, type);

        result.Result = jsonresult;
    }
    catch (Exception ex)
    {
        result.Message = "Problem obtaining data.";
    }

    return result;
}

我希望它能够在不取消的情况下完成获取请求

从你的问题和评论听起来,你的请求超时了。尝试设置属性

公共异步任务获取数据(字符串url,CancellationToken ct=default(CancellationToken)) { 结果=新结果(); 尝试 { var request=(HttpWebRequest)WebRequest.Create(url); request.Method=“GET”; HttpResponseMessage response=等待httpClient.SendAsync(请求);//httpClient httpClient.TimeOut=TimeSpan.MaxValue//根据需要更改此值 字符串jsonresult=await HandleReceipt(响应,类型); result.result=jsonresult; } 捕获(例外情况除外) { result.Message=“获取数据时出现问题。”; } 返回结果; } 编辑

关于您对例外情况的评论,请参阅MSDN:

在调用GetRequestStream或GetResponse方法之前,必须设置Timeout属性


在发出请求之前,创建一个新的
HttpClient实例
,或者将其设置在初始化客户端的代码中(我假设是构造函数)。

正如Yuval Itzhakov提到的,您应该将Timeout属性设置为一个更大的值(但它是一个TimeSpan而不是一个整数)如果使用异步模式,则应该在HTTP请求调用中使用取消令牌。 而且,特别是在这个调用噩梦的重异步方法中,不需要使用全局HttpClient(正如Yuval指出的那样)(此外,我不明白为什么要在AcquinData异步中调用任何东西)

公共异步任务获取数据(字符串url,CancellationToken ct=default(CancellationToken)) { 尝试 { 使用(var httpClient=新的httpClient { 超时=TimeSpan.MaxValue }) { 使用(var request=newhttprequestmessage(HttpMethod.Get,url)) { 使用(var response=wait-httpClient.SendAsync(请求,ct)) { 返回新的ActionResult() { 结果=等待HandlerReceipt(响应,类型) }; } } } } 捕获(例外情况除外) { 返回新的ActionResult { Message=“获取数据时出现问题。”+ex }; } }
请求是否需要时间才能完成?是的,它可以很好地处理请求的小数据集。但是,它给了我“一个任务被取消了”这样的信息,我还需要在视图中添加一些类似于“加载”的内容。。但这就像它的第一部分,它不像是你在使用你的取消令牌,从方法存根,我猜这是另一个你没有声明的,可能是从SendAsync?显示异常的堆栈跟踪。谢谢你,Yuval,我添加了这一行,但它说“此实例已启动一个或多个请求。只能在发送第一个请求之前修改属性”。我还将这一行移到了请求上方。但仍然会得到相同的错误。我认为httpclient正在被ping服务或类似的东西使用。。所以它会在某处发送一个取消令牌。。是否有办法检查此问题?请尝试设置
HttpClient
的新实例:
var-client=new-HttpClient
,并使用该实例使request@ergwin注意:我编辑了
HttpWebRequest
的创建,因为我看到使用的是过时的。
public async void GetJsonData()
{
    string json = await ObtainData();
}
public async Task<ActionResult<string>> ObtainData(string url, CancellationToken ct = default(CancellationToken))
{            
   Result<string> result = new Result<string>();
   try
   {
       var request = (HttpWebRequest) WebRequest.Create(url);
       request.Method = "GET";
       HttpResponseMessage response = await httpClient.SendAsync(request); //HttpClient
       httpClient.TimeOut = TimeSpan.MaxValue // change this as you like

       string jsonresult = await HandleReceipt(response, type);

       result.Result = jsonresult;
   } 
   catch (Exception ex)
   {
      result.Message = "Problem obtaining data.";
   }

   return result;
}
    public async Task<ActionResult<string>> ObtainData(string url, CancellationToken ct = default(CancellationToken))
    {
        try
        {
            using (var httpClient = new HttpClient
            {
                Timeout = TimeSpan.MaxValue
            })
            {
                using (var request = new HttpRequestMessage(HttpMethod.Get, url))
                {
                    using (var response = await httpClient.SendAsync(request, ct))
                    {
                        return new ActionResult<string>()
                        {
                            Result = await HandleReceipt(response, type)
                        };
                    }
                }
            }
        }
        catch (Exception ex)
        {
            return new ActionResult<string>
            {
                Message = "Problem obtaining data. " + ex
            };
        }
    }