我們有Windows服務,它從MSMQ讀取消息並逐個處理它。爲了提高性能/吞吐量,我們搬到了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服務器,應用程序池目標.Net 2.0中。 WCF服務端,serviceThrottling爲500,Service Service上沒有ServiceBehavior屬性定義。我們在同一時間在兩個控制檯實例之一上運行同步選項,其次是同步選項。 Sync選項比Async選項完成得快得多。我的假設是,系統在執行異步操作時不會從ThreadPool釋放任務。問題是,哪種方法更好(同步與異步WCF調用),還是在這種情況下有任何不同的方法來處理WCF調用。
WCF服務端的'UpdateArchiveStatus'裏面發生了什麼? – Noseratio
它使用SharePoint API來更新SharePoint列表。 – brijshah