WCF實例與并發
實例模式 :
{
PerSession,
PerCall,
Single
}
并發部分:
{
Single,
Reentrant,
Multiple
}
public interface IAdd
{
[OperationContract]
void Add(int x, int y);
}
{
private readonly int counter = 0;
public AddService()
{
counter++;
Console.ResetColor();
Console.WriteLine(string.Format("AddService Construction function excute... counter is {0}", counter));
}
#region IAdd 成員
public void Add(int x, int y)
{
var clientId = OperationContext.Current.IncomingMessageHeaders.GetHeader<int>(MessageWrapper.headerClientId,
MessageWrapper.headerNamespace);
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(string.Format("Time:{0};ThreadId is :{1}.Request Id is {2} Add Method Invoked,", DateTime.Now,Thread.CurrentThread.ManagedThreadId,clientId));
Console.WriteLine(string.Format("result is : {0}",x + y));
Thread.Sleep(5000);
Console.WriteLine("=========Excute finished=========");
Console.WriteLine();
}
#endregion
}
<services>
<service name="Service.AddService">
<endpoint address="http://127.0.0.1:3636/AddService" binding="basicHttpBinding" contract="Contract.IAdd"></endpoint>
</service>
</services>
</system.serviceModel>
客戶端配置這里不再給出。 客戶端調用代碼:
for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem(delegate
{
int clientId = Interlocked.Increment(ref index);
using (OperationContextScope contextScope =
new OperationContextScope(proxy as IContextChannel))
{
MessageHeader<int> header = new MessageHeader<int>(clientId);
System.ServiceModel.Channels.MessageHeader messageHeader =
header.GetUntypedHeader(MessageWrapper.headerClientId,
MessageWrapper.headerNamespace);
OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);
proxy.Add(1, 2);
}
});
}
測試1:PreCall + Multiple:
輸出如下:

圖1
由以上輸出,服務對客戶端調用是以串行的方式進行的。 以上我們設置的ConcurrencyMode.Muliple。明明是并發模式,為何服務端卻以串行的方式執行呢。?這是因為如果服務代理以自動開啟的方式(即進行調用時,如果代理沒有打開,調用時會打開代理)進行并發調用,WCF需要對調用進行序列化知道代理打開之后在進行并發處理。如果將代理顯示開啟,則就能顯示并發調用結果。對代碼進行如下修改:
if (null != proxy as ICommunicationObject)
{
(proxy as ICommunicationObject).Open();
}
for ()
{
/**/ }
服務端輸出如下:

圖2
測試2:PerSession + Single/Reentrant
測試3: Single + Single
圖3
測試4: Single + Multiple

測試5:PerCall+ Single/Reentrant/Multiple

圖5
由以上分析對于不同實例模式,以及并發模式總結如下圖:

浙公網安備 33010602011771號