제 3 자 웹 서비스를 사용하고 기능을 크게 확장하는 WebService를 작성하고 있습니다. 예를 들어, 워크 플로의 한 부분에서 하나의 API 호출 결과를 반복해야하고 각 결과에 대해 실제로 사용할 수있는 결과를 반환하기 위해 다른 API 호출을 만들어야합니다. 현재 약 7,500 줄의 XML과 3 ~ 4 분의 로딩 시간이 있습니다 (이로드 시간은 Visual Studio에서 디버그 모드로 WebService를 실행하는 것을 기반으로합니다. 하이 엔드 Windows 서버에서 실행될 때 약간 더 부드럽게 작동 할 것으로 기대하십시오). 내가 뭘하고 싶은지 각 비서 호출을위한 새로운 Asyncronous 스레드를 생성하는 방법을 찾을 수 있습니다 (그래서 각 반복은 이전 반복이 끝날 때까지 기다릴 필요가 없습니다), 그러나 나는 이것을 어떻게 아직도하는지 잘 모르겠습니다. 동일한 함수 호출에서 XML 출력을 리턴 할 수 있어야합니다. 어떤 아이디어?비동기 호출로 웹 서비스의 속도를 높이려는 것이지만 확실하지는 않습니다.
:: EDIT :: - 다음은 XML을 생성하는 코드입니다. 모든 함수 호출은 타사 API에 대한 API 호출에 대한 래퍼 일뿐입니다.
public List<AvailabilityList> getResortsForDate(String month, int year) {
List<RegionList> regions = this.getRegionLists();
List<AvailabilityList> availability = new List<AvailabilityList>();
foreach(RegionList parent in regions)
{
foreach(Region child in parent.Regions)
{
if (!String.Equals(child.ID, "?"))
{
int countryID = Int32.Parse(parent.CountryID);
AvailabilityList current = this.getExchangeAvailability(countryID, month, year, child.ID);
if (current.ListCount != 0)
{
availability.Add(current);
}
}
}
}
return availability;
}
:: 편집 # 2 : 해결책! 이것은 제가 사용했던 솔루션입니다. 이것은 제가 선택한 대답에 대한 사소한 조정입니다. 감사! 이전 코드 (5 분 1 초)를 계산 한 후,이 코드는 1 분 6 초에 큰 발전을 보였습니다. 30 초의 시간이 내가 최적화 할 다른 방법에 속합니다.
public List<AvailabilityList> _asyncGetResortsForDate(String month, int year) {
List<RegionList> regions = this.getRegionLists();
List<AvailabilityList> availability = new List<AvailabilityList>();
List<WaitHandle> handles = new List<WaitHandle>();
List<AvailabilityList> _asyncResults = new List<AvailabilityList>();
regions.ForEach(parent => {
parent.Regions.ForEach(child => {
if (!String.Equals(child.ID, "?")) {
int countryID = Int32.Parse(parent.CountryID);
Func<AvailabilityList> _getList =() => this.getExchangeAvailability(countryID, month, year, child.ID);
IAsyncResult res = _getList.BeginInvoke(new AsyncCallback(
x => {
AvailabilityList result = (x.AsyncState as Func<AvailabilityList>).EndInvoke(x);
if (result.ListCount > 0)
{
_asyncResults.Add(result);
}
}), _getList);
while (handles.Count >= 60)
{
int item = WaitHandle.WaitAny(handles.ToArray());
handles.RemoveAt(item);
}
handles.Add(res.AsyncWaitHandle);
}
});
});
WaitHandle.WaitAll(handles.ToArray());
return _asyncResults;
}
함께 작업하는 아이디어를 제공하는 코드를 게시해야합니다. 또한 반복되는 결과의 수와 원격 서비스에서 얼마나 많은 데이터를 다운로드하고 있습니까? 비동기식으로이 작업을 수행하면 성능이 전반적으로 향상된다는 보장이 반드시 필요한 것은 아니며 다른 요소가 많습니다. 동기 호출을 사용하는 것이 병목 일 수도 있고 아닐 수도 있습니다. –
'_asyncResults.Add (result)'는 여러 스레드가 동시에 그것을 실행하면 문제가 발생할 것입니다. 잠금 장치 또는 다른 유형의 동기화로 보호해야합니다. –