C#:线程中止而不完成剩余的请求
我已经实现了一个调度器,它将请求发送到第三方端点。收到响应后,我的本地数据库将更新为响应。目前,我正在发送超过50K个请求(每10分钟发送1K个请求)并处理响应。问题有时是第三方服务器没有响应或请求超时。在这种情况下,我得到一个异常,线程被中止,而不处理剩余的请求。我需要的是不要中止线程并继续处理下一条记录,以便在另一批中处理丢失的记录。这是我正在使用的代码C#:线程中止而不完成剩余的请求,c#,multithreading,abort,C#,Multithreading,Abort,我已经实现了一个调度器,它将请求发送到第三方端点。收到响应后,我的本地数据库将更新为响应。目前,我正在发送超过50K个请求(每10分钟发送1K个请求)并处理响应。问题有时是第三方服务器没有响应或请求超时。在这种情况下,我得到一个异常,线程被中止,而不处理剩余的请求。我需要的是不要中止线程并继续处理下一条记录,以便在另一批中处理丢失的记录。这是我正在使用的代码 public class ScheduledAPIJob : IJob { public Task Execute(IJobExe
public class ScheduledAPIJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
Task taskAPI = Task.Factory.StartNew(() => ProcessAPI());
return taskAPI;
}
void ProcessAPI()
{
//Error logging object
SchedulerLogWriter lw = new SchedulerLogWriter("Logs\\Scheduler");
List<WeatherData> list = new List<WeatherData>();
APIQueueBAL objBal = new APIQueueBAL();
//List of endpoints to hit.
var APIQueue = objBal.QueuedAPIs();
foreach (var item in APIQueue)
{
try
{
var endpoint = item.FunctionParameters;
HttpRequestHelper objRequestHelper = new HttpRequestHelper();
//Response from API
var response = objRequestHelper.GetAPIResponse(endpoint);
////Update local database.
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
list = JsonConvert.DeserializeObject<List<WeatherData>>(response.Content.ReadAsStringAsync().Result);
objBal.ProcessWeatherData(item, list);
}
}
catch (Exception ex)
{
lw.WriteLog(ex.Message);
lw.WriteLog(Convert.ToString(ex.InnerException));
lw.WriteLog(ex.StackTrace);
}
}
}
}
public class HttpRequestHelper
{
public HttpResponseMessage GetAPIResponse(string apiEndpoint)
{
using (var client = new HttpClient())
{
var getTask = client.GetAsync(apiEndpoint);
getTask.Wait();
return getTask.Result;
}
}
}
公共类ScheduledAPIJob:IJob
{
公共任务执行(IJobExecutionContext上下文)
{
Task taskAPI=Task.Factory.StartNew(()=>ProcessAPI());
返回taskAPI;
}
void ProcessAPI()
{
//错误日志记录对象
SchedulerLogWriter lw=新的SchedulerLogWriter(“日志\\调度程序”);
列表=新列表();
APIQueueBAL objBal=新的APIQueueBAL();
//要命中的端点列表。
var APIQueue=objBal.QueuedAPIs();
foreach(队列中的变量项)
{
尝试
{
var端点=item.FunctionParameters;
HttpRequestHelper objRequestHelper=新的HttpRequestHelper();
//API的响应
var response=objRequestHelper.GetAPIResponse(端点);
////更新本地数据库。
if(response.StatusCode==System.Net.HttpStatusCode.OK)
{
list=JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);
objBal.ProcessWeatherData(项目、列表);
}
}
捕获(例外情况除外)
{
lw.书面记录(例如信息);
WriteLog(Convert.ToString(ex.InnerException));
lw.书面记录(例如StackTrace);
}
}
}
}
公共类HttpRequestHelper
{
公共HttpResponseMessage GetAPIResponse(字符串apiEndpoint)
{
使用(var client=new HttpClient())
{
var getTask=client.GetAsync(apident);
getTask.Wait();
返回getTask.Result;
}
}
}
使用(var client=new HttpClient())
您应该new
创建其中一个,而不是每个请求一个。1)不要创建和处理大量的HttpClient。保留它们,以便可以重用TCP连接。2) 为什么不将所有内容转换为异步方法呢?请共享一个。由于您的代码中没有线程,也没有任何明显中止线程的代码,很遗憾,无法回答您的问题。我会在您的代码中随意地散布日志语句,以便您可以隔离执行中止的位置。它必须在你调用的代码中,你没有向我们展示。@LasseV.Karlsen。这很容易解决。