分類
發燒車訊

特斯拉將於 9 月 29 日對外發表 Model X

特斯拉宣布,將於美國時間 9 月 29 日在加州費利蒙市發佈旗下 SUV 車型 Model X。   費利蒙市是特斯拉汽車工廠所在地,特斯拉屆時可能會公佈 Model X 的價格和車型配置。而 Model X 將於 9 月 30 日開始首批交車,現在訂車的客戶可於明年初交車。   Model X 後車門採鷗翼式設計,充飽電後可行駛里程達 240 英里,靜止加速到時速 60 英里只需 3.8 秒,極速時速 155 英里。由於車身重量比 Model S 要重,因此它的續航里程也有所縮水,單次充電可行駛 230 至 265 英里  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

分類
發燒車訊

Tesla 不懼挖角,Elon Musk:不合格的員工都去了蘋果

  蘋果公司啟動電動車研發專案後,從汽車廠商、電池製造商挖角了大量員工,包括電動車製造商 Tesla,近日 Tesla CEO Elon Musk 在接受採訪時表示,他並不擔心蘋果挖角工程師和管理人員,被挖角的員工多是被 Tesla 解雇的,如果員工無法承擔在 Tesla 的工作,那可以考慮去蘋果公司。   蘋果公司的電動車專案遭到了許多汽車產業人士的唱衰,Tesla CEO Elon Musk 表示,歡迎蘋果公司加入電動車產業,但研發汽車的難度遠高於智慧手機和手錶,在汽車產業內不可能找到一家像富士康那樣的代工廠,汽車的供應鏈和製造環節更加複雜,對於一家毫無汽車產業背景的公司而言,研發電動汽車不是一件容易的事。   蘋果公司從汽車產業挖角了大量研發人才,不少 Tesla 的員工也跳槽到了蘋果,Elon Musk 對於蘋果的挖角並不擔心,據他透露在公司內部蘋果公司被稱為 Tesla 的墳墓,如果你在 Tesla 幹不下去了,可以考慮去蘋果公司謀個職位。     本文全文授權轉載自《科技新報》——〈〉

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

分類
發燒車訊

上海明年電動車免費牌照可望延續

近年積極在推廣電動車的上海,據該市的新能源汽車推進辦人士透露,明年上海的免費牌照政策可望延續。據業界專家指出,由於上海車牌動輒 9 至 10 萬人民幣,這項政策對電動車發展極有助益。   據解放網報導,上海未來在標誌性的文化場所、學校、醫院等公共場所,將率先推廣公共充電站建設;在公務車、公共交通領域率先應用電動汽車取得突破,提高電動汽車在汽車消費市場的比重,形成「電動汽車+分時租賃」的公共交通新常態。   電動汽車租賃相關的 evcard 分時租賃專案,則以從郊區發展到市中心,今年年底前將會有 500 個充電站建成 。截 至目前,上海新能源汽車免費掛上海車牌的入圍品牌已經有30 多家,總共發放了 3 萬張。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

分類
發燒車訊

2016第七屆廣州國際新能源汽車工業展覽會

時間:2016年6月8-10日

地點:廣州琶洲保利世貿博覽館

主辦單位:廣州中汽國際展覽有限公司

  專業的組織機構——展會是中汽國際展覽有限公司按照“專業化、國際化、品牌化”原則舉辦的新能源汽車及配套設施行業國際品牌盛會。國內外多家單位協辦,既有政府支持,又有行業權威的參與。展會舉行期間,將有商務部及省市領導、業界權威人士蒞臨展會參觀指導並出席開幕剪綵。

  龐大採購團隊——盛會將邀請來自中國、美國、德國、法國、英國、義大利、巴西、墨西哥、西班牙、俄羅斯、瑞典、捷克、匈牙利、中東、日本、韓國、印度、土耳其、新加坡、越南、泰國、臺灣、香港、澳門等國家和地區眾多新能源汽車及配套設施進出口貿易商、代理商、經銷商及國際著名相關採購協會組織率團到會參觀採購。

●  高端論壇——展會將邀請新能源汽車及配套設施行業權威專家,討論中外新能源汽車及配套設施行業最新動態、發展趨勢、分工格局、相關對策等多個熱門議題。就中國新能源汽車及配套設施行業發展現狀及所面臨的問題作深入報告,針對中國新能源汽車及配套設施行業市場行情作研究報告,並對產品開發、技術創新等作細緻的演講。屆時,將安排我們認為在國際新能源汽車及配套設施領域,具有影響力的企業介紹產品概況、最新技術動向等進行講座和交流。擬邀請中國政府高級官員,有關專家、學者,國際著名機構代表,著名新能源汽車及配套設施產品供應商、採購商,中國新能源汽車及配套設施市場企業代表和其他專業觀眾出席,其行業的引導性和權威性令人期待,是中國新能源汽車及配套設施產業發展和國際交流合作的風向標,將是獲取新能源汽車及配套設施行業資訊和把握國際市場的最佳平臺。

※ 展會介紹

在能源匱乏的時代,綠色、節能、環保成為經濟發展的核心主題,新能源汽車具有良好的環保性能和燃料經濟性好、運行成本低等優勢,既可以保護環境,又可以緩解能源的短缺並能調整能源的結構,保障能源的安全。

21世紀是一個面臨能源和環境巨大挑戰的世紀,傳統燃油汽車將向高效低排放的電動汽車及混合動力車方向發展。大力發展新能源汽車是能源與環境的必然要求,而且,中國發展新能源汽車的壓力更為緊迫。根據國家《汽車與新能源汽車產業發展規劃》(2011-2020),將在“十二五”期間重點發展清潔能源汽車,未來十年僅中央財政就投入上千億元用來支持以純電動車、混合動力汽車為代表的節能與新能源汽車的研發與推廣。2014年5月24日上午,國家主席習近平在上海汽車集團考察時強調,發展新能源汽車是我國從汽車大國邁向汽車強國的必由之路,要加大研發力度,認真研究市場,用好用活政策,開發適應各種需求的產品,使之成為一個強勁的增長點。2014年多地出臺補貼政策,國務院發文:2014年9月1日起免征新能源汽車車輛購置稅,各種利好消息層出不窮,可以預見,未來我國新能源汽車必將會迅速發展。

廣州是廣東省會,改革開放前沿城市,中國對外貿易的重要視窗,經濟實力雄厚,市場潛力巨大。廣東是泛珠三角經濟區域的中心,毗鄰港、澳、台,輻射東南亞,海、陸、空交通便利,市場輻射面廣,經濟發達。隨著CEPA的實施,粵、港、澳以及泛珠三角(9+2)區域合作與發展的良性互動,必將給新能源汽車及配套設施產業創造無限美好的發展前景。為順應高速發展的新能源汽車及配套設施行業,廣州中汽國際展覽有限公司聯合行業權威機構定于2016年6月8-10日在廣州琶洲保利世貿博覽館舉辦“2016第七屆廣州國際新能源汽車工業展覽會”(NEA CHINA 2016),展會將深化活動內涵,秉承推動行業發展、為企業服務的宗旨,為商家提供一個拓展業務、技術交流、展示實力、獲取資訊、結交客戶、推廣新產品、尋找合作夥伴的國際商貿平臺。

我們將以“突出品牌、開拓創新、注重實效、強化服務”的辦展宗旨,憑藉獨特的創意,科學的組織管理和卓越的服務,以全新的理念為廣大中外參展商提供一個“高水準、高品味、高品質”的展示交流平臺,為全球新能源汽車及配套設施行業提供更多的合作機會,有力推動中國新能源汽車及配套設施產品全面進入全球採購體系,與世界各國新能源汽車及配套設施產業協調合作、互利共贏、共同發展進步。

※ 展品範圍

純電動車:轎車、大巴、公車、各旅行車、各種純電動特種車(環衛車、電力車、郵政車、小型客貨車、高爾夫車、房車、叉車、搬運車、旅遊觀光車、摩托車、三輪車等);

混合動力車:轎車、大巴、公車、各型旅行車等;

其他能源車:超級電容、燃料電池、氫能、生物燃料、太陽能及氫能源、天然氣等各種新能源、清潔燃料及低排放、環保節能型車等;

零部件:低排放節能型發動機、混合動力發動機及清潔燃料發動機;動力電池與管理系統;整車匯流排與控制系統;電機與電控系統;充電裝置;儲能裝置等;能源管理系統;電力電容器、飛輪、逆變器、電熱泵、電動助力轉向、電動空調、功率模組等;相關材料、工藝、技術;相關檢測、監控、試驗、安全防護裝備;維修、製造設備和工具等;

充電設施:充電站智慧型網路專案規劃及成果展示,加油站擴建充(換)電站、加油充電綜合服務站展示,太陽能、風能互補新能源汽車充電站技術產品,充電站充電機、充電樁、配電設備、變壓器、更換設備、電能、監控系統、有源濾波裝置、配電櫃、電纜、直接充電設備、管理輔助設備、充換電池及電池管理系統、停車場充電設施、智慧監控、充電站供電解決方案、充電站等。

其他:新能源汽車的整車及系統控制設計等。

※ 目標觀眾

主辦單位將重點邀請的目標觀眾包括:
1、商務部、發改委、科技部、工信部、國家環保局等各局、司、中心、所領導;
2、全國各省市主管部門領導、大型企事業、機關單位領導;
3、全國各高校、科研單位、設計院、研究院、協(學)會領導;
4、公交、出租、環衛、郵政等單位負責人;車站、機場、碼頭、房地產、大型物業公司、高爾夫球場、旅遊景點、公園、體育場館、大專院校、度假村等單位負責人;
5、國內外著名生產、代理、經銷商、貿易公司等業內人士參觀、參展、技術交流。

※ 展會日程

報到布展:2016年6月6-7日
展出時間:2016年6月8-10日
撤展時間:2016年6月10日下午

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

分類
發燒車訊

Docker學習(三)-簡單的私有DockerHub搭建

Docker Hub

目前Docker官方維護了一個公共倉庫https://hub.docker.com, 其中已經包括100000+個的鏡像。大部分需求都可以通過在 Docker hub中直接下載鏡像來實現,

註冊登錄

可以在 免費註冊一個Docker賬號。在命令行執行docker login輸入用戶名及密碼來完成在命令行界面登記Docker Hub。你可以通過docker logout退出登錄。

docker login

 

拉取鏡像

可以通過docker search命令來查找官方倉庫中的鏡像,並利用docker pull命令來將它下載到本地。

 

推送鏡像

用戶也可以在登錄后通過docker push命令來將自己的鏡像推送到Docker Hub。

docker pull tomcat

 docker images

修改本地鏡像的名字為賬號名/鏡像名

上傳鏡像到公共倉庫

docker push woxpp/tomcat-test:latest

登錄界面查看

docker pull woxpp/tomcat-test

 

私有倉庫

有時候使用Docker Hub這樣的公共倉庫可能不方便,用戶可以創建一個本地倉庫供私人使用。比如,基於公司內部項目構建的鏡像。
docker-registry是官方提供的工具,可以用於構建私有的鏡像倉庫。

安裝運行docker-registry

可以通過獲取官方registry鏡像來運行。默認情況下,倉庫會被創建在容器的/var/lib/registry目錄下。可以通過-v參數來將鏡像文件存放在本地的指定路徑。

docker run --name registry -d  -p 5000:5000 --restart=always  -v /opt/registry:/var/lib/registry registry
docker ps -a

測試是否成功

使用docker tag將session-web:latest這個鏡像標記為192.168.50.24:5000/session-web:latest格式為docker tag IMAGE:TAG/]REPOSITORY[:TAG]

docker tag docker.io/tomcat 192.168.50.24:5000/tomcat-2:latest

使用docker push上傳標記的鏡像

docker push 192.168.50.24:5000/tomcat-2:latest

驗證上傳的鏡像

 

 

 先刪除已有鏡像,再嘗試從私有倉庫中下載這個鏡像。

docker images
 docker rmi 192.168.50.24:5000/tomcat-2
docker pull 192.168.50.24:5000/tomcat-2 

 

注意事項

The push refers to a repository [192.168.50.24:5000/consul]
Get https://192.168.50.24:5000/v1/_ping: http: server gave HTTP response to HTTPS client

可以用下面方式解決

修改客戶端/etc/docker/daemon.json中寫入如下內容

{
    "registry-mirror":[
        "http://hub-mirror.c.163.com"
    ],
    "insecure-registries":[
        "192.168.50.24:5000"
    ]
}

重新啟動docker后再試試
service docker restart

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

分類
發燒車訊

SpringBoot之微服務日誌鏈路追蹤

SpringBoot之微服務日誌鏈路追蹤

簡介

在微服務里,業務出現問題或者程序出的任何問題,都少不了查看日誌,一般我們使用 ELK 相關的日誌收集工具,服務多的情況下,業務問題也是有些難以排查,只能確定大致時間定位相關日誌。log-trace-spring-boot-starter 解決多個服務調用日誌的問題,它可以將一個完整的調用鏈給整合為一個完整有序的日誌。

支持組件:

  • zuul 調用
  • feign 調用
  • restTemplate 調用

日誌輸出格式:

2019-11-14 14:22:07.796  INFO [log-trace-service-a-demo,ac8ffaaed5f343da,log-trace-zuul-demo,,] 88948 --- [nio-8081-exec-7] c.p.l.t.service.a.demo.TestController    : controller test2 執行 ac8ffaaed5f343da
2019-11-14 14:23:15.569  INFO [log-trace-service-a-demo,04cf5392dc5c4881,log-trace-zuul-demo,,] 88948 --- [nio-8081-exec-9] c.p.l.t.service.a.demo.TestController    : controller test2 執行 04cf5392dc5c4881
2019-11-14 14:24:44.183  INFO [log-trace-service-a-demo,86b5c555ce4f4451,log-trace-zuul-demo,,] 88948 --- [nio-8081-exec-1] c.p.l.t.service.a.demo.TestController    : controller test2 執行 86b5c555ce4f4451

我們可以通過 86b5c555ce4f4451 id 進行查詢鏈路上的所有日誌信息。

log-trace-service-a-demo 為當前應用。
log-trace-zuul-demo 為上游應用。

當然這些參數可以基於業務定製的。

功能使用

添加依賴

ps: 實際version版本請使用最新版
最新版本:

<dependency>
  <groupId>com.purgeteam</groupId>
  <artifactId>log-trace-spring-boot-starter</artifactId>
  <version>0.1.0.RELEASE</version>
</dependency>

ps: 請基於 SpirngBoot2.1.x 版本使用

配置應用

這裏以3個微服務來舉例子。

  1. log-trace-zuul-demo 充當網關功能
  2. log-trace-service-a-demo 充當服務A
  3. log-trace-service-b-demo 充當服務B

調用鏈路為:

log-trace-zuul-demo -> log-trace-service-a-demo TestController#test -> log-trace-service-b-demo TestController#test

訪問網關地址: http://127.0.0.1:8000/a/test

網關日誌如下:

2019-11-14 14:27:37.434 DEBUG [33b07a9c5f324375,this] 89996 --- [nio-8000-exec-1] c.p.l.t.s.i.zuul.TracePreZuulFilter      : zuul traceid 33b07a9c5f324375

網關轉發至服務A

服務A 日誌如下:

2019-11-14 14:27:37.476  INFO [log-trace-service-a-demo,33b07a9c5f324375,log-trace-zuul-demo,,] 88948 --- [nio-8081-exec-5] c.p.l.t.service.a.demo.TestController    : controller test2 執行 33b07a9c5f324375

服務A 調用 服務B

服務B 日誌如下:

2019-11-14 14:27:37.478  INFO [log-trace-service-b-demo,33b07a9c5f324375,log-trace-service-a-demo,,] 88952 --- [nio-8082-exec-3] c.p.l.t.servcie.b.demo.TestController    : header traceId 33b07a9c5f324375
2019-11-14 14:27:37.478  INFO [log-trace-service-b-demo,33b07a9c5f324375,log-trace-service-a-demo,,] 88952 --- [nio-8082-exec-3] c.p.l.t.servcie.b.demo.TestController    : controller test 執行 33b07a9c5f324375
2019-11-14 14:27:37.478  INFO [log-trace-service-b-demo,33b07a9c5f324375,log-trace-service-a-demo,,] 88952 --- [nio-8082-exec-3] c.p.l.trace.servcie.b.demo.TestService   : test 方法執行 33b07a9c5f324375
2019-11-14 14:27:37.478  INFO [log-trace-service-b-demo,33b07a9c5f324375,log-trace-service-a-demo,,] 88952 --- [nio-8082-exec-3] c.p.l.trace.servcie.b.demo.TestService   : test1 方法執行 33b07a9c5f324375

這樣可以在第三方日誌平台按照一個id進行查詢了。

ELK 通過 33b07a9c5f324375 id 查詢出相關的所有鏈路調用。

配置輸出格式

目前支持以上參數:

X-B3-ParentName 上游服務名稱
X-B3-TraceId 為一個請求分配的ID號,用來標識一條請求鏈路。

通過 application.properties 進行配置。

spring.trace.log.format=X-B3-TraceId,X-B3-ParentName


`spring.trace.log.format` 配置參數順序將影響日誌輸出格式。

不配置將按照默認格式輸出。

日誌輸出如下:

2019-11-14 14:27:37.434 DEBUG [33b07a9c5f324375,this] 89996 --- [nio-8000-exec-1] c.p.l.t.s.i.zuul.TracePreZuulFilter      : zuul traceid 33b07a9c5f324375

總結

目前實現了日誌連貫的功能,後續將支持定製輸出 比如按照登陸人員id進行輸出,方便追蹤用戶行為。
框架方便後續支持 Dubbo 等。

示例代碼地址:

作者GitHub:
歡迎關注

qq交流群: 812321371 微信交流群: MercyYao

微信公眾號:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

分類
發燒車訊

西班牙東北部化學工廠爆炸 釀1死6傷

摘錄自2020年1月15日中央社報導

西班牙東北部發生化學工廠爆炸事故,造成一人喪命,傷及六人。當地媒體引述消防人員的說法表示,爆炸很有可能是化學意外所引起。

「先鋒報」(La Vanguardia)和「國家報」(ElPais)等媒體在網站上表示,這起在塔拉戈納省(Tarragona)發生的爆炸引發衝擊波,造成一棟建築物坍塌,一人身亡。

加泰隆尼亞救災服務處發言人證實,附近有建築物倒塌並有一人喪生,但還無法確定大樓倒塌與爆炸或大火有關。

民防局建議附近民眾待在室內,並預防性緊鎖門窗,但說:「沒有證據顯示(爆炸)產生有毒的煙霾。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

分類
發燒車訊

中國向美國買稀土 美中貿易協議內容引議論

摘錄自2020年1月16日中央社報導

中美16日達成第一階段貿易協議,協議中驚現中國向美國購買稀土的承諾。由於中國是全球最大的稀土生產國,貿易戰中也曾宣稱以限制稀土出口反制美國,這項承諾立即引起外界議論。

在中美第一階段貿易協議中,中國承諾未來兩年向美國購買2000億美元產品。路透社報導,其中包括鈧和釔等兩種用於生產燈具和電腦的稀土。稀土曾被視為中國的「殺手鐧」,如今中國卻向美國購買,箇中原因引起各方議論。

此外,報導也指出,美國國防部近幾個月已採取行動,為美國的稀土、稀土磁鐵項目提供資金,目的是要建立一個沒有中國的「國內供應鍊」。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

分類
發燒車訊

.NET進階篇06-async異步、thread多線程2

知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑

內容目錄

一、線程Thread

.NET中線程操作封裝為了Thread類,可以讓開發者對線程進行直觀操作。Thread提供了實例方法用於管理線程的生命周期和靜態方法用於控制線程的一些訪問存儲等一些外在的屬性,相當於工作空間環境變量了

1、生命周期

線程的生命周期有創建、啟動、可能掛起、等待、恢復、異常、然後結束。用Thread類可以容易控制一個線程的全生命周期

Thread類的構造函數重載可以接受ThreadStart無參數和ParameterizedThreadStart有參數的委託,然後調用實例的Start()方法啟動線程。Thread的構造函數的帶有參數的委託,參數是一個object類型,因為我們可以傳入任何信息

Thread t1 = new Thread(() => {
    Console.WriteLine($"新線程  {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
t1.Start();
Thread t2 = new Thread((obj) => {
    Console.WriteLine($"新線程  {Thread.CurrentThread.ManagedThreadId.ToString("00")},參數 {obj.ToString()}");
});
t2.Start("hello kitty");

線程啟動后,可以調用線程的Suspend()掛起線程,線程就會處於休眠狀態(不繼續執行線程內代碼),調用Resume()喚醒線程,還有一個不太建議使用的Abort()通過拋出異常的方式來銷毀線程,隨後線程的狀態就會變為AbortRequested

常用的還有線程的等待,在主線程上啟用工作線程后,有時需要等待工作線程的完成后,主線程才繼續工作。可以調用實例方法Join(),當然我們可以傳入時間參數來表明我主線程最多等你多久

2、後台線程

上一章我們知道Thread默認創建的是前台線程,前台線程會阻止系統進程的退出,就是啟動之後一定要完成任務的後台線程會伴隨着進程的退出而退出。通過設置屬性IsBackground=true改為後台線程。另外還可以通過設置Priority指定線程的優先級。但這個並不總會如你所想設置了高優先級就一定最先執行。操作系統會優化調度,這也是線程不太好控制的原因之一

3、靜態方法

上面介紹的都是Tread的實例方法,Thread還有一些常用靜態方法。有時線程設置不當,會有些意想不到的的bug

1.線程本地存儲

AllocateDataSlot和AllocateNamedDataSlot用於給所有線程分配一個數據槽。像下面例子所示,如果不在子線程中給數據槽中放入數據,是獲取不到其他線程往裡面放的數據。

var slot= Thread.AllocateNamedDataSlot("testSlot");
//Thread.FreeNamedDataSlot("testSlot");
Thread.SetData(slot, "hello kitty");
Thread t1 = new Thread(() => {
    //Thread.SetData(slot, "hello kitty");
    var obj = Thread.GetData(slot);
    Console.WriteLine($"子線程:{obj}");//obj沒有值
});
t1.Start();

var obj2 = Thread.GetData(slot);
Console.WriteLine($"主線程:{obj2}");

在聲明數據槽的時候.NET提醒我們如果要更好的性能,請使用ThreadStaticAttribute標記字段。什麼意思?我們來看下面這個例子

//
// 摘要:
//     在所有線程上分配未命名的數據槽。 為了獲得更好的性能,請改用以 System.ThreadStaticAttribute 特性標記的字段。
//
// 返回結果:
//     所有線程上已分配的命名數據槽。
public static LocalDataStoreSlot AllocateDataSlot();

例子中的如果不在靜態字段上標記ThreadStatic輸出結果就會一致。ThreadStatic標記指示各線程的靜態字段值是否唯一

[ThreadStatic]
static string name = string.Empty;
public void Function()
{
    name = "kitty";
    Thread t1 = new Thread(() => {
        Console.WriteLine($"子線程:{name}");//輸出空
    });
    t1.Start();
    Console.WriteLine($"主線程:{name}");//輸出kitty
}

還有一個ThreadLocal提供線程數據的本地存儲,用法和上面一樣,在每個線程中聲明數據僅供自己使用

ThreadLocal<string> local = new ThreadLocal<string>() { };
local.Value = "hello kitty";
Thread t = new Thread(() => {
    Console.WriteLine($"子線程:{local.Value}");
});
t.Start();
Console.WriteLine($"主線程:{local.Value}");

上面的靜態方法用於線程的本地存儲TLS(Thread Local Storage),Thread.Sleep方法在開發調試時也是經常用的,讓線程掛起指定的時間來模擬耗時操作

2.內存柵欄

先說一個常識問題,為什麼我們發布版本時候要用Release發布?Release更小更快,做了很多優化,但優化對我們是透明的(計算機里透明認為是個黑盒子,內部邏輯細節對我們不開放,和生活中透明意味着完全掌握了解不欺瞞剛好相反),一般優化不會影響程序的運行,我們先借用網上的一個例子

bool isStop = false;
Thread t = new Thread(() => {
    bool isSuccess = false;
    while (!isStop)
    {
        isSuccess = !isStop;
    }
});
t.Start();
Thread.Sleep(1000);
isStop = true;
t.Join();
Console.WriteLine("主線程執行結束");

上面例子如果在debug下能正確執行完直到輸出“主程序執行結束”,然而在release下卻一直會等待子線程的完成。這裏子線程中isStop一直為false。首先這是一個由多線程共享變量引起的問題,所以我們建議最好的解決辦法就是盡量不共享變量,其次可以使用Thread.MemoryBarrier和VolatileRead/Write以及其他鎖機制犧牲一點性能來換取數據的安全。(上面例子測試如果在子線程while中進行Console.writeLine操作,奇怪的發現release下也能正常輸出了,猜測應該是進行了內存數據的更新)

release優化會將t線程中的isStop變量的值加載到CPU Cache中,而主線程修改了isStop值在內存中,所以子線程拿不到更新后的值,造成數據不一致。那麼解決辦法就是取值時從內存中獲取。Thread.MemoryBarrier()就可以讓在此方法之前的內存寫入都及時的從CPU Cache中更新到內存中,在此之後的內存讀取都要從內存中獲取,而不是CPU Cache。在例子中的while內增加Thread.MemoryBarrier()就能避免數據不一致問題。VolatileRead/Write是對MemoryBarrier的分開解釋,從處理器讀取,從處理器寫入。

4、返回值

前面聲明線程時,可以傳遞參數,那麼想要有返回值該如何去做呢?Thread並沒有提供返回值的操作,後面.NET給出的對Thead的高級封裝給出了解決方案,直接使用即可。那目前我們使用thread類就要自己實現下帶有返回值的線程操作,都是通過委託實現的,這裏簡單介紹一種,(共享外部變量也是可以,不建議)

private Func<T> ThreadWithReturn<T>(Func<T> func)
{
    T t = default(T);
    Thread thread = new Thread(() =>
    {
        t = func.Invoke();
    });
    thread.Start();
    return () =>

    {
        thread.Join();
        return t;
    };
}
//調用
Func<intfunc = this.ThreadWithReturn<int>(() =>
{
    Thread.Sleep(2000);
    return DateTime.Now.Millisecond;
});
int iResult = func.Invoke();

二、線程池ThreadPool

.NET起初提供Thread線程類,功能很豐富,API也很多,所以使用起來比較困難,況且線程還不都是很像理想中運行,所以從2.0開始提供了ThreadPool線程池靜態類,全是靜態方法,隱藏了諸多Thread的接口,讓線程使用起來更輕鬆。線程池可用於執行任務、發送工作項、處理異步 I/O、代表其他線程等待以及處理計時器

1、工作隊列

常用ThreadPool線程池靜態方法QueueUserWorkItem用於將方法排入線程池隊列中執行,如果線程池中有閑置線程就會執行,QueueUserWorkItem方法的參數可以指定一個回調函數委託並且傳入參數,像下面這樣

ThreadPool.QueueUserWorkItem((obj) => {
                Console.WriteLine($"線程池中線程  {Thread.CurrentThread.ManagedThreadId.ToString("00")} ,傳入 {obj.ToString()}");
            },"hello kitty");

2、工作線程和IO線程

一般異步任務的執行,不涉及到網絡文件等IO操作的,計算密集型,開發者來調用。而IO線程一般用在文件網絡上,是CLR調用的,開發者無需管。工作線程發起文件訪問調用,由驅動器完成后通知IO線程,IO線程則執行異步任務的回調函數

獲取和設置最小最大的工作線程和IO線程

ThreadPool.GetMaxThreads(out int workerThreads, out int completionPortThreads);
ThreadPool.GetMinThreads(out int workerThreads, out int completionPortThreads);
ThreadPool.SetMaxThreads(1616);
ThreadPool.SetMinThreads(88);

3、和Thread區別

如果計算機只有8個核,同時可以有8個任務運行。現在我們有10個任務需要運行,用Thread就需要創建10個線程,用ThreadPool可能只需要利用8個線程就行,節約了空間和時間。線程池中的線程默認先啟動最小線程數量的線程,然後根據需要增減數量。線程池使用起來簡單,但也有一些限制,線程池中的線程都是後台線程,不能設置優先級,常用於耗時較短的任務。線程池中線程也可以阻塞等待,利用ManualResetEvent去通知,但一般不會使用。

4、定時器

.NET中有很多可以實現定時器的功能,在ThreadPool中,我們可以利用RegisterWaitForSingleObject來註冊一個指定時間的委託等待。像下面這樣,將每隔一秒就輸出消息

ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((obj, b) =>
{
    Console.WriteLine($"obj={obj},tid={Thread.CurrentThread.ManagedThreadId},datetime={DateTime.Now}");
}),"hello kitty",1000,false);

我們平常見過比較多的還是timer類,timer類在.net內是好幾個地方都有的,在System.Threading、
System.Timer、System.Windows.Form、System.Web.UI等裏面都有Timer,後面都是在第一個System.Threading里的Timer擴展

System.Threading.Timer timer = new System.Threading.Timer((obj) =>
{
    Console.WriteLine($"obj={obj},tid={Thread.CurrentThread.ManagedThreadId},datetime={DateTime.Now}");
},"hello kitty",1000,1000);

timer的底層有一個TimerQueue,利用ThreadPool.UnsafeQueueUserWorkItem來完成定時功能,和上面我們使用的ThreadPool定時器有一點區別

實際開發中,簡單定時timer就夠用,但一般業務場景比較複雜,需要定製個性化的定時器,比如每月幾號執行,每月第幾個星期幾,幾點執行,工作日執行等。因此我們使用Quarz.NET定時框架,後面框架整合時會用到,用起來也是很簡單的

先就啰嗦這兩點吧,下一篇應該是Task、Parallel以及Async/Await,然後總結介紹下C#的線程模式、線程同步鎖機制、異常處理,線程取消,線程安全集合和常見的線程問題

天長水闊,見字如面,隨緣更新,拜了個拜~

可關注主頁公號獲取更多哈

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

分類
發燒車訊

玩轉VSCode-完整構建VSCode開發調試環境

隨着VSCode的不斷完善和強大,是時候將部分開發遷移到VS Code中了。

目前使用VS2019開發.NET Core應用,一直有一個想法,在VS Code中復刻VS的開發環境,同時遷移到VS Code。

那麼現在就開始吧。

首先,安裝最新版的VS Code:,安裝完成后可能會提示升級,升級即可,升級后的版本信息:

版本: 1.40.1 (system setup)
提交: 8795a9889db74563ddd43eb0a897a2384129a619
日期: 2019-11-13T16:49:35.976Z
Electron: 6.1.2
Chrome: 76.0.3809.146
Node.js: 12.4.0
V8: 7.6.303.31-electron.0
OS: Windows_NT x64 10.0.16299

接下來的操作分為幾個步驟:

1. 安裝各種強大VS Code插件

2. 創建.NET Core解決方案和工程

3. 調試運行

好的,那我們開始吧。

一、安裝各種強大的VS Code插件

1. C# extension for Visual Studio Code

這個插件最重要的功能:

  • Lightweight development tools for .
  • Great C# editing support, including Syntax Highlighting, IntelliSense, Go to Definition, Find All References, etc.
  • Debugging support for .NET Core (CoreCLR). NOTE: Mono debugging is not supported. Desktop CLR debugging has .
  • Support for project.json and csproj projects on Windows, macOS and Linux.

2. C# Extensions

這個插件最有用的功能是可以右鍵新建C#類和C#接口,同時支持各種code snippets,例如 ctor 、prop等,具體功能特性,可以查看插件的說明。

 3. Auto-Using for C#

這個插件自動添加using引用。

4. vscode-solution-explorer

這個插件給VS Code增加了解決方案tab, 支持新建解決方案、新建工程、添加引用、Nuget包,這個插件非常有用

Adds a Solution Explorer panel where you can find a Visual Studio Solution File Explorer.

  • Can load any .sln version

  • Supports csproj, vcxproj, fsproj and vbproj (from vs2017 and before)

  • Supports dotnet core projects

  • You can create, delete, rename or move project folders and files.

  • You can create, delete, rename or move solution, solution folders and projects.

  • You can add or remove packages and references when the project is of kind CPS (dotnet core).

 

5. Code Runner(韓俊老師出品,必屬精品)

Run code snippet or code file for multiple languages: C, C++, Java, JavaScript, PHP, Python, Perl, Perl 6, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, F# (.NET Core), C# Script, C# (.NET Core), VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Visual Basic .NET, Clojure, Haxe, Objective-C, Rust, Racket, Scheme, AutoHotkey, AutoIt, Kotlin, Dart, Free Pascal, Haskell, Nim, D, Lisp, Kit, and custom command

即選中一段代碼,直接run

6. vscode-icons

通過這個插件,給各個文件和文件夾一個你更熟悉的圖標

7. Visual Studio IntelliCode

VS代碼智能提示,根據上下文語境,自動推薦你下一步用到的代碼,後台基於AI的

8. NuGet Package Manager

Nuget包管理,快速查詢定位Nuget包,並安裝。不過嘗試了一下午自定義Nuget源,沒搞定,估計是URL不對

9. Docker

10. Kubernetes

其他的還需要配置GitHub、TFS類似的源代碼管理,TFS搞了兩個插件,都不好使,後續搞定后再更新一次。

 

二、創建.NET Core解決方案和工程

此時,VS Code的環境基本配置差不多了,接下來有兩種模式,創建解決方案和工程。

1. 通過vscode-solution-explorer

解決方案有了,很熟悉的感覺。

我們可以繼續創建工程:右鍵sln,Add new project:

此時會彈出工程模板,此時我們選擇ASP.NET Core Web API工程

選擇C#

然後繼續輸入工程名稱:例如 TestWebApi

熟悉的感覺來了。此時就可以開始coding了。

以上是我們通過vscode-solution-explorer新建解決方案和工程。同時我們可以通過命令行來搞定。

2. 通過Dotnet CLI命令行

新建sln:

dotnet "new" "sln" "-n" "EricTest" "-o" "e:\Work\ServiceDependency"

新建ASP.NET Core WebAPI工程

dotnet "new" "webapi" "-lang" "C#" "-n" "TestWebApi" "-o" "TestWebApi"

將TestWebApi工程添加到解決方案EricTest

dotnet "sln" "e:\Work\ServiceDependency\EricTest.sln" "add" "e:\Work\ServiceDependency\TestWebApi\TestWebApi.csproj"

三、調試運行

在Debug選項卡中新增調試配置,重點設置要調試的program

保存后,啟動調試:

 

程序中增加斷點,然後

輸入URL:https://localhost:5001/WeatherForecast

 既可以調試了。

 

以上是今天集中配置VS Code開發調試環境的總結,分享給大家。

 

周國慶

2019//11/16

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!