MSMQ에서 메시지를 읽고 하나씩 처리하는 Windows 서비스가 있습니다. 성능/처리량을 향상시키기 위해 TPL로 이전했습니다. 메시지를 처리하는 동안 데이터베이스 호출과 WCF 호출이 있습니다. 우리는 WCF 호출을하는 동안 첫 번째 호출은 더 빠르지 만 후속 호출은 더 오랜 시간이 걸리는 것을 관찰했습니다. 다음은 샘플 코드입니다.비동기 WCF 호출에 더 많은 시간이 소요됩니다. 동기화 호출
public class TestWcf
{
public void Process(string option)
{
// container for perellel tasks and WaitAll after 50 count
TaskContainer batch = new TaskContainer(50, true);
for (int i = 1; i <= 100; i++)
{
if(option.Equals("s"))
{
batch.Add(ProcessMessage);
}
else
{
batch.Add(ProcessMessageAsync);
}
}
}
public void ProcessMessage()
{
Stopwatch sw = Stopwatch.StartNew();
PostingServiceClient client = new PostingServiceClient();
client.UpdateArchiveStatus(Guid.Parse("B6D5C77C-330A-4B00-96BF-E91A2B5970E3"),"1234567890");
sw.Stop();
Console.WriteLine("Thread {0}, Elapsed Time: {1} s", Thread.CurrentThread.ManagedThreadId, sw.Elapsed.Seconds);
//client.Close();
}
public void ProcessMessageAsync()
{
Stopwatch sw = Stopwatch.StartNew();
PostingServiceClient client = new PostingServiceClient();
var task = Task.Factory.FromAsync(
client.BeginUpdateArchiveStatus(Guid.Parse("B6D5C77C-330A-4B00-96BF-E91A2B5970E3"), "1234567890", null,
null), client.EndUpdateArchiveStatus);
task.Wait();
sw.Stop();
Console.WriteLine("Thread {0}, Elapsed Time: {1} s", Thread.CurrentThread.ManagedThreadId, sw.Elapsed.Seconds);
//client.Close();
}
}
우리는 외부 팀 WCF를 사용하고 있으며 IIS 서버, App Pool targeting .Net 2.0에서 호스팅됩니다. WCF 서비스 측면에서 serviceThrottling은 500이며 서비스 계약에 정의 된 ServiceBehavior 특성이 없습니다. Sync 옵션이있는 콘솔 인스턴스 2 개와 비동기 옵션이있는 콘솔 인스턴스 2 개로 동일한 시간에 프로그램을 실행했습니다. 동기화 옵션은 비동기 옵션보다 훨씬 빠르게 완료되었습니다. 내 가정, 시스템 비동기 작업을 수행하는 동안 ThreadPool에서 작업을 공개하지 않습니다. 문제는 어떤 접근 방식이 더 좋고 (Sync vs. Async WCF 호출) 아니면이 시나리오에서 WCF 호출을 처리 할 수있는 다른 접근 방식이 있는지입니다.
WCF 서비스 측의'UpdateArchiveStatus' 내부에서 어떤 일이 벌어지고 있습니까? – Noseratio
SharePoint API를 사용하여 SharePoint 목록을 업데이트합니다. – brijshah