C#:线程中止而不完成剩余的请求

C#:线程中止而不完成剩余的请求,c#,multithreading,abort,C#,Multithreading,Abort,我已经实现了一个调度器,它将请求发送到第三方端点。收到响应后,我的本地数据库将更新为响应。目前,我正在发送超过50K个请求(每10分钟发送1K个请求)并处理响应。问题有时是第三方服务器没有响应或请求超时。在这种情况下,我得到一个异常,线程被中止,而不处理剩余的请求。我需要的是不要中止线程并继续处理下一条记录,以便在另一批中处理丢失的记录。这是我正在使用的代码 public class ScheduledAPIJob : IJob { public Task Execute(IJobExe

我已经实现了一个调度器,它将请求发送到第三方端点。收到响应后,我的本地数据库将更新为响应。目前,我正在发送超过50K个请求(每10分钟发送1K个请求)并处理响应。问题有时是第三方服务器没有响应或请求超时。在这种情况下,我得到一个异常,线程被中止,而不处理剩余的请求。我需要的是不要中止线程并继续处理下一条记录,以便在另一批中处理丢失的记录。这是我正在使用的代码

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。这很容易解决。