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