【发布时间】:2014-03-06 09:39:48
【问题描述】:
我们有 Windows 服务,它从 MSMQ 读取消息并一一处理。为了提高性能/吞吐量,我们转移到了 TPL。在处理消息时,我们有几个数据库调用和 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,并且服务合同上没有定义 ServiceBehavior 属性。我们使用两个控制台实例同时运行上述程序,一个带有 Sync 选项,第二个带有 Async 选项。同步选项的完成速度比异步选项快得多。我的假设是,系统在执行异步操作时不会从 ThreadPool 释放任务。问题是,哪种方法更好(同步与异步 WCF 调用),或者在这种情况下是否有任何不同的方法来处理 WCF 调用。
【问题讨论】:
-
WCF 服务端的
UpdateArchiveStatus内部发生了什么? -
它正在使用 SharePoint API 来更新 SharePoint 列表。
标签: wcf asynchronous task-parallel-library