【轉】WCF中的InstanceContext與ConcurrencyMode

来源:http://www.cnblogs.com/lovecsharp094/archive/2016/08/03/5734498.html
-Advertisement-
Play Games

一、前言 最近忙於公司的線上升級項目,一個人要負責公司四大產品的線上升級,這四個產品是在Revit中以插件形式存在的,目前基於WCF來實現。等客戶總量突破5萬了,再重新用socket實現。 由於有伺服器併發操作,所以要好好研究WCF的InstanceContext與ConCurrencyMode,找 ...


一、前言

最近忙於公司的線上升級項目,一個人要負責公司四大產品的線上升級,這四個產品是在Revit中以插件形式存在的,目前基於WCF來實現。等客戶總量突破5萬了,再重新用socket實現。

由於有伺服器併發操作,所以要好好研究WCF的InstanceContext與ConCurrencyMode,找了好多文章,都沒這篇寫的言簡意賅,特轉發保留。

 

二、原文內容

原作者版權信息****************************************************************************************************************

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://arthurshayne.blog.51cto.com/3491820/1241514

***************************************************************************************************************************

 

今天學習了徐長龍老師的<<跟我一起從零開始學WCF>>的第9講<<會話,實例與併發>>,對實例與併發有點混於是去網上查了一下,發現一篇不錯的文章推薦給大家http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and#Instance

由此談一些自己對實例與併發的看法,實例與併發不是同一件事情,但又相互有影響。以下我就舉一些有趣的例子來談談我對WCF中實例與併發的理解。

先 照本宣科一下,WCF的實例通過InstanceContext屬性來指定,可以的取值是 Single, PerSession, PerCall。併發通過ConcurrencyMode屬性來指定,可以的取值是 Single, Multiple, Reentrant。它們的組合就有3*3=9種。Reentrant的併發模式實質上就是Single的一個特殊情況最後再討論。 InstanceContext 用於控制服務對象的個數,ConcurrencyMode用於控制服務對象是否可以同時服務多個請求。

好了我們開始舉例,假如我們的服務是做早點,InstanceContext決定了我們有幾個師傅來做早點,而ConcurrencyMode決定了每個師傅只能一個一個的做還是同時把要做的一起做。下麵開始分情況逐一說明:

1. InstanceContext  = Single & ConcurrencyMode = Single

InstanceContext = Single  我們這個早點鋪就一個師傅

ConcurrencyMode = Single 師傅一次只能做一件事兒

不難想象如果買早點的人多了就會排著長長的隊,而且如果前面有一個人要5套早點,那後面的人只能等那個人完事兒才能輪到自己。對師傅能力要求不高,一次做好一件事兒就好。

2.InstanceContext = Single & ConcurrencyMode = Multiple

InstanceContext = Single 我們這個早點鋪就一個師傅

ConcurrencyMode = Multiple 師傅同時做所要做的事兒

這個是早點鋪老闆想要的情況,雇最少的人乾最多的事,但是對做早點的師傅要求非常高,一次要做好很多事。不能人一多就做亂了把張三的燒餅少做一個,把李四的豆漿多做了一碗等。

3.InstanceContext = PerSession & ConcurrencyMode = Single

InstanceContext = PerSession 為每個顧客提供一個師傅專門服務(顧客來時現招,顧客走後就解雇)

ConcurrencyMode = Single 某一時刻只有一個師傅工作,每個師傅一次只能做一件事兒。

這 在現實生活中不可能存在但在電腦中卻非常常見,所以我的例子只是說明關鍵問題,請不要太較真。這時第個顧客都會有一個專門的師傅來服務,但我們只有一個 廚房並且只能容下一個師傅,給張三服務的師傅做早點時別的師傅只能等待。師傅一次只能做一樣東西,如果一個顧客要了很多的東西,那師傅一樣一樣的來做。所 以可以還是單線程只是有多個師傅而已。對師傅能力要求不高,一次做好一件事兒就好。

4.InstanceContext = PerSession & ConcurrencyMode = Multiple

InstanceContext = PerSession 為每個顧客提供一個師傅專門服務(顧客來時現招,顧客走後就解雇)

ConcurrencyMode = Multiple 所有的師傅同時工作,每個師傅可以同時做所要做的所有事兒

這在現實生活中也是不可能存在的。這時每個顧客都會有一個專門的師傅來服務,並且師傅們都可以同時工作,並且師傅可以同時做所有要做的所有早點。對師傅的要求較高,因為只是同時處理一個顧客的所有早點。

5. InstanceContext = PerCall & ConcurrencyMode = Single

InstanceContext = PerCall 為每個顧客要的每個需求都提供一個師傅專門服務(顧客提出要求時現招,師傅做完後就被解雇)

ConcurrencyMode = Single 某一時刻只有一個師傅工作,每個師傅只用做一件事兒。

這在現實生活中也是不可能存在的。這下師傅更多了,與情況3一樣在某一時刻只能有一個師傅工作,不同的是師傅只用做一件事兒。對師傅能力要求不高,能做好一件事兒就好。

6. InstanceContext = PerCall & ConcurrencyMode = Multiple

InstanceContext = PerCall  為每個顧客要的每個需求都提供一個師傅專門服務(顧客提出要求時現招,師傅做完後就被解雇)

ConcurrencyMode = Multiple 所有的師傅同時工作,每個師傅只用做一件事兒。

這在現實生活中也是不可能存在的。這時客戶的滿意度理論上是最高的,顧客的每個要求都有師傅在做,而且所有的師傅在同時做事兒。當然這對早點鋪的老闆要付出的代價是最大的。對師傅能力要求不高,能做好一件事兒就好。

7. InstanceContext = * & ConcurrencyMode = Reentrant

這 種情況比較特殊,假如我們不生產早點全是從別的早點鋪去買來然後再倒手給顧客,傳說中的騎驢。這時假如顧客說出需要什麼需要5秒鐘的時間,我們打電話向其 它店索要,其它店再把東西送到需要1分鐘,再把送來的東西給到顧客手中需要5s的時間。可見店內處理時間為10s,大量的時間在調貨的時間(調用別的服 務)。所以這時比較合理的處理是,利用調貨的時間來處理後面顧客的需求,在這1分鐘的時間里可以處理20個顧客的需求,並且20個調貨請求也已經發送。等 到第1個顧客的貨送到後再轉回來為其完成剩下的服務,這樣可以節省很多後面顧客等待的時間。InstanceContext無論取什麼值都與 ConcurrencyMode = Single的差不多只是針對有外部調用的情況有所優化。

我在上面提到的對師傅要求高或較高的情況, 也就表明我們的程式需要做一些線程安全的處理,保證我們的程式在多線程的情況下不會出現錯誤。對師傅要求不高的情況就是不存在併發的情況。以上是我對 InstanceContext和ConcurrencyMode的一點個人理解,如有不妥之處請指教。

 

 

原文版權信息**************************************************************************

本文出自 “唯有文字劃破時空” 博客,請務必保留此出處http://arthurshayne.blog.51cto.com/3491820/1241514


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 總結一下自己給編輯器定製樣式的過程中所遇到的問題,主要是編輯器的二次開發介面,以及用angular定製樣式,問題不少,終於在**的幫助下,完成了,還剩下老版本和新版本的交互沒有弄好,不過不難。下麵分別講解問題。 ueditor的開發 你可以在官網上下載任意版本,進行使用即可:http://uedit ...
  • JS DOM 來控制HTML元素 (ps:這個有很多方法,挑一些詳解,嘻嘻) 1.getElementsByName():獲取name. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 例:<p name="pn">hello</p> <p name="pn">hello</ ...
  • JavaScript借鑒了許多語言的特點;例如語法類Java、函數借鑒Scheme、原型繼承借鑒自Self、正則表達式借鑒於Perl。(DC Javascript:語言精粹)。 首先,每個JS是一門基於原型繼承的面向對象的語言。裡面數組是對象、函數是對象、“對象”當然還是對象。而且每個對象都有一個i ...
  • SQL:Structured Quety Language SQL SERVER是一個以客戶/伺服器(c/s)模式訪問、使用Transact-SQL語言的關係型資料庫管理子系統(RDBMS) DBMS :Database Management System資料庫管理系統 資料庫:程式用來存取數據的 ...
  • 最近因為項目原因需要在阿裡雲伺服器上部署mongodb,網上查閱了一些資料,特此記錄一下步驟 1.運行apt-get install mongodb命令安裝mongodb服務(如果提示找不到該package,說明apt-get的資源庫版本比較舊,運行apt-get update來更新資源庫) 2.安 ...
  • 在查詢分析器中執行:select rand(),可以看到結果會是類似於這樣的隨機小數:0.36361513486289558,像這樣的小數在實際應用中用得不多,一般要取隨機數都會取隨機整數。那就看下麵的兩種隨機取整數的方法:1、A:select floor(rand()*N) 生成的數是這樣的:12 ...
  • 之前介紹了Linux的Screen命令,今天介紹一個更為強大的終端工具Tmux。 Tmux 是一個用於在一個終端視窗中運行多個終端會話的工具。它基本能替代nohup以及screen,甚至比它們更為強大: Screen 的項目大體上已經終止,並且代碼中有大量的問題,使用起來很不穩定; Tmux 是一個 ...
  • 簡介: .Net中Process類功能十分強大。它可以接受程式路徑啟動程式,接受文件路徑使用預設程式打開文件,接受超鏈接自動使用預設瀏覽器打開鏈接,或者打開指定文件夾等等功能。 想要使用Process類之前,需要先引用using System.Diagnostics; Process類用法1: Pr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...