2017-12-09 4 views
0

함대에서 차량의 GPS 위치를 요청하는 API 게시물을 보낼 수있는 올바른 아키텍처를 제안하려고합니다. 목적은 상태에 대한 10 개 이상의 요청을 폭발시킨 다음 각 스레드가 응답을 기다린 다음 그 결과를 데이터베이스 테이블에 삽입하는 것입니다. 요청과 응답은 Json입니다. 한 번에 하나씩 코드가 동 기적으로 작동하므로 차량 당 2 분이 소요될 수 있습니다. 내 코드는 다음과 같습니다ASP.NET C# API에 게시하고 상태를 병렬로 기다립니다.

클라이언트 측 자바 스크립트 타이머는이 btnGetData_Click에게 제출 트리거

btnGetData_Click이 DoVehicleGetStatus()를 호출 다음 await를 타격 한 후

public static async Task DoVehiclePollStatus() 
int vehicleInfoId;    
string vehicleVIN; 
string vehicleMileage; 
string tokenId; 
// Build DataSet with list of vehicle information needed to log in. 

// Loop thru each Vehicle. 
int iCount = ds.Tables[0].Rows.Count; 
foreach (DataRow dr in ds.Tables[0].Rows) 
{ 
vehicleInfoId = Convert.ToInt32(dr["Id"]);       
vehicleVIN = dr["VehicleVIN"].ToString(); 
vehicleMileage = dr["VehicleListMileage"].ToString(); 
tokenId = dr["VehicleListToken"].ToString(); 

// Serialize LoginInfo to Json    
DataClass.GetStatusRequestBodyStruct getFromVehicle = new DataClass.GetStatusRequestBodyStruct(); 
getFromVehicle.getFromVehicle = true; 
string requestJsonMessage = new JavaScriptSerializer().Serialize(getFromVehicle); 

DataClass.GetVehicleStatusStruct vs = new DataClass.GetVehicleStatusStruct(); 

HttpClient httpClient = new HttpClient(); 

httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type","application/json"); 

StringContent httpContent = new StringContent(requestJsonMessage); 

// Set Header Parameters 
try 
{ 
    httpContent.Headers.TryAddWithoutValidation("tokenId", tokenId); 
    httpContent.Headers.TryAddWithoutValidation("VIN", vehicleVIN); 

    HttpResponseMessage response = await httpClient.PostAsync(new Uri(DataClass.API_URIGetVehicleStatus), httpContent); 

    } 
    catch (Exception ex) 
    { 
    errorMessage = ex.Message; 
    } 
    ....  
    ..save response (string) data in database...  

을 httpClient.PostAsync 프로그램 실행을 반환하고 나는 결코 요청 게시물의 응답을 되돌립니다. 이 디자인이 올바르지 않은 경우 더 나은 방법을 제안 해주십시오.

답변

0

오류에 따르면 public static async void DoVehiclePollStatus()public static async Task DoVehiclePollStatus()으로 변경해야합니다. 비동기 void를 사용하지 않는 것이 좋습니다.

+0

감사합니다. 정적 비동기 작업을 사용하여 일부 하위 메서드를 다시 작성한 후 DoVehiclePollStatus()는 훌륭하게 작동합니다. 나는 10+ 차량을 조사 할 수 있고 2 분 이내에 모든 응답을 되돌릴 수있다. 20를 위해 연속적으로 기다리지 않는! 나는 프로그래밍을 좋아한다! – IrvineCAGuy