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

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

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

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

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

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

【其他文章推薦】

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

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

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

2016中國國際新能源汽車峰會

2016中國國際新能源汽車峰會將于明年3月在北京召開

隨著化石能源、石油資源的日益枯竭,大氣污染和溫室氣體的排放,加之傳統內燃機驅動汽車的能源利用率很低,新能源汽車已成為未來發展的必然趨勢。

新能源汽車是我國戰略性新興產業之一,也是我國應對氣候變化、保障能源安全、減少溫室氣體排放、防治城市空氣污染的重要途徑之一。近10年來,我國把新能源汽車作為未來汽車的主要發展方向,從國家層面給予了極大的關注和支持。去年,我國新能源汽車產銷量較上年增長了三倍,這種爆發式增長,是國家對於新能源汽車不斷加大政策扶持的結果。

在這一市場背景下,2016中國國際新能源汽車峰會將立足於中國新能源汽車行業的實際情況,進一步解析業內人士比較關心的政策法規和最新的技術動向以及未來的發展趨勢,深入探討電控集成系統、無線充電技術以及新能源汽車切入能源互聯網的契機等熱點話題。這裡還將是一個您與政府高層、OEM製造商、行業領袖和專家進行跨國項目交流的最佳平臺。

會議亮點:
•    十三五新能源汽車發展規劃
•    充電新標準出臺和實施時間
•    新能源汽車產業的全球市場戰略
•    探索未來電池新材料技術
•    三元鋰電池最新技術
•    驅動電機的效率提升和性能優化
•    電池管理系統如何提高整包級別的安全性
•    電機控制器如何改善電機運行效率並降低能耗
•    整車控制器的關鍵技術
•    充電樁技術和網路建設
•    無線充電技術的巨大市場前景
•    插電式混合動力的技術和市場
•    電動汽車電氣系統的設計與優化
•    燃料電池汽車未來的商業化路徑
•    新能源商用車市場剖析和關鍵技術
•    開放技術專利能否推動新能源汽車行業加速發展
•    互聯網如何推動新能源汽車產業升級
•    新能源汽車切入能源互聯網的契機
•    與傳統汽車租賃公司的合作模式
•    金融租賃如何解圍新能源汽車的商業模式困局

請聯繫:
Lucy Shi 石小姐
電話: +86 21- 33191337-623
手機:+86 13166042312
郵箱:
會議網址:

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

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

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

福建物價局:電動汽車充電服務費1.2元/度為上限

據福建省物價局最新批復,電動汽車充電服務費實行政府指導價管理,充電服務費標準(不含電費)上限按1.2元/度收取,下浮不限。   理論上來說,給電動汽車充電採取“充電服務費+電費”的繳費方式。充電電費方面,分兩種情況

  1. 集中接入電網的充電樁,高峰時段0.9139元/度,低谷時段0.3305元/度,其餘時段0.6222元/度。
  2. 分散接入電網的充電樁,居民家庭住宅、居民住宅社區的充電設施收0.533元/度;到黨政機關、企事業單位和社會公共停車場中設置的充電設施用電高峰時段收1.15975元/度,低谷時段收0.41445元/度,其餘時段收0.7871元/度。

據悉,相比於汽油、天然氣,用電的成本更低。據業內人士統計,在廈門,計程車司機用油每公里成本在0.6元-0.7元,用氣每公里成本約在0.4元,而用電每公里成本在0.3元。目前,廈門新建的充電樁設備只有計程車可充電,未對社會車輛開放。運管處相關人士透露,他們上月報備的充電服務費為0.6元/度。   而對於從事電動汽車充換電設施服務的經營性企業來說,2020年前免收基本電費。

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

【其他文章推薦】

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

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

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

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

富士康杭州投12億,發展新能源汽車租賃業務

富士康集團總投資12億元,註冊資本1億元,成立杭州浙譽新能源汽車服務有限公司。作為富士康科技集團在杭州開展新能源汽車分時租賃運營的服務主體,專案計畫三年內在杭州地區累計投放5000輛電動汽車。   電動汽車分時租賃是一種城市短途出行方式,在汽車共用的基礎上使用電動汽車進行共用運營,通過會員制的方式以小時計費的新能源電動汽車的租賃服務。其租賃模式就像“租公共自行車一樣”,會員通過網路或手機終端輕鬆實現汽車預定,然後線上下取車實現消費,整個過程全程自助。   該專案是2015年3月富士康集團與杭州市政府簽署全面戰略合作協議後,與杭州進行全面深化合作所邁出的實質性第一步。

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

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

普天新能源與江淮汽車合作,拓展新能源汽車業務

日前,江淮汽車與普天新能源有限責任公司簽訂5年的合作協議,雙方擬在市場推廣、充電網路建設、創新服務模式等方面開展全面合作,實現車輛和充電設施網路的協調發展,推動中國新能源汽車的“彎道超車”。   江淮汽車表示,此次合作將促進新能源業務的發展,實現公司的新能源戰略。

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

【其他文章推薦】

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

※網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

特斯拉:把電動汽車裡的電賣回給電網未來或可實現

近日,特斯拉中國公共策劃與充電基礎設施總監高翔在接受記者採訪時表示,“充電並不是一件很難的事情“,甚至以後可以“把電賣給電網“。

電動汽車充電並不難

目前,對比汽油車加油,電動車充電仍然給人們一種“充電還是很困難“的感覺。高翔對此解釋道,汽油車發展超過100年了,剛開始也是很困難,但是現在到處都有加油站,我們也覺得很方便。而事實上,充電並沒有我們想像中那麼難,舉例來說,電動車充電並不需要像加油站那樣大的土地,也不需要擔憂運輸、儲油的安全性問題。

據悉,目前特斯拉汽車的充電方式有三種:一是家庭充電,充電設備隨車贈送;二是建在各大商場、酒店、旅遊地的“目的地充電樁”,方便車主外出時充電。跟家電充電一樣,目的地充電樁同樣是支援220V電壓,所以充電時間較長,充滿一次需要11.5-13小時左右;三是超級充電站。由於其配備的超級充電器是通過特製電纜繞過車載充電設備,直接將380V的直流電輸入電池,所以充電時間大為縮短。目的地充電樁每充電1小時可行駛至少50公里,而使用超級充電站,20分鐘就能充滿一半,80分鐘即可完全充滿,並可行駛400公里以上。並且車主在此可以免費充電。

電動車發展明年將會進入爆發式增長

為什麼大家對發展電動汽車有很深的理解,一個是霧霾,近幾年日益嚴重;另外一個是能源危機,我們採用的化石能源60%左右依賴於進口。在能源危機和環境壓力面前,我們需要很好的解決方案。而在出行方式裡面,汽油車占到90%的汽油消耗量,所以電動汽車對這方面有很大的幫助。

同時,國家新的標準馬上也要發佈,高翔預測,整個電動車行業到2016年將會進入一個爆發式增長,甚至在以後,國家除了對車進行補貼外,也將會對基礎設施進行支持,大力推進基礎設施充電的發展。有了這些,剩下的就是企業把車做好。未來充電市場和電動車行業一定是相輔相成的。

把車裡的電賣給電網

電動汽車行業與電網本來就是天然的合作關係。電動汽車除了把電能作為能源之外,其實也是能源互聯網以及智慧電網中的一個環節。據高翔介紹,電網作為一個承擔著中國電力行業社會責任的企業,對於電動汽車的發展一直都是支援的,特別是北上廣深等大城市,在這方面有著非常清晰的政策。

而從長遠來看,電動汽車的發展對電網來說也是一個好事。充電設施多了,對電網企業了來說,最重要的絕不是“充個電、收個服務費“,而是未來發展智慧電網、甚至是發展車和電網的互聯互通。比如說VTOG(雙向逆變充放電技術),從車反過來給電網充電,充好電的車相當於無數個儲能電池,對電網起到削峰填穀的作用,也就是說,晚上用不掉的電儲存到車裡來,白天用電高峰時候電動汽車用戶再把這些電散落地賣還給電網。

高翔解釋道,現在電網發電還做不到即時的調控,要滿足高峰用電,就需要按照需求最大值來發電,但是電網大多數時間是用不了這麼多電的,晚上好多電用不掉但是也不能停,否則經濟損失很大。如果採取了上面這種做法的話,不但車主能得到收益,電網也能節省很大的發電及儲能成本,將是一個非常理想的削峰填穀模式。

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

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

Uber響應環保 在中國大陸推出「電動車日」

中國大陸霧霾嚴重,交通工具被視為兇手之一,故中央政府已開始推出電動車推廣政策,希望能減輕霾害問題。線上叫車業者Uber響應減碳,首度在北京、上海、廣州、成都等中國大陸的13個城市啟動「電動車日」,只要駕駛開電動車載客,就能享受額外獎勵。

中國Uber表示,「電動車日」的活動是為了響應環保減碳而推出。叫車用戶可透過Uber叫車平台呼叫特斯拉、北汽新能源等電動車,或者豐田Corolla Hybrid或Levin等油電混和車。此外,在今年底前以電動車車款加入共乘的車主將可享有額外獎勵,將能鼓勵中國大陸民眾購置電動車。

據統計,Uber上海平台上已有30%的車主駕駛電動車,Uber未來也將與更多電動車品牌合作,透過共乘與綠能發展計畫推廣環保。

根據中新財經網報導,目前中國大陸汽車數量已達2.76億輛,所排放的廢氣對霾害影響甚大。若能以電動車取代燃油車,對於霾害會有正面幫助。中國大陸官方已陸續在各地推出電動公車,並祭出電動車補助措施以及產業補貼,希望能增加民眾採用電動車的比例。

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

【其他文章推薦】

※網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※南投搬家前需注意的眉眉角角,別等搬了再說!

這是下一個 Tesla!新創公司 Faraday 宣布 10 億美元電動車投資計畫

近日一家在洛杉磯成立的新創公司 Faraday Future 引發了巨大關注,號稱投資 10 億美元建設電動車製造廠,據該公司官網顯示 4 位副總裁來自 Tesla,團隊規模大約為 400 人,這一投資規模在整個電動車產業來看,都不是一筆小數目。

Faraday Future 的總部位於洛杉磯南部,相比於一般新創公司而言,Faraday Future 的團隊規模比較大,目前已經擁有了 400 名員工,這家專注於電動車市場的新創公司並沒有在業內引發太多關注。最近華爾街日報報導該公司宣布投資 10 億美元建廠,這一筆投資使得 Faraday 聲名大振。   據該公司的網站資訊顯示,Faraday Future 將以使用者為中心,把一流的技術引入電動車設計、致力於連結使用者的駕駛體驗和生活。4 位副總裁均來自電動車製造商 Tesla,Tesla Model S 製造業務總監 Dag Reckhorn 擔任製造業務副總裁,Tesla 前人力資源總監 Alan Cherry 擔任 Faraday 的人力資源副總裁,Tesla 前採購總監 Tom Wessner 擔任 Faraday 供應鏈管理副總裁。但未公開 CEO 的資訊,據加州政府提供的 Faraday Future 註冊資訊顯示,該公司的 CEO 與中國網路公司樂視有密切關係,出任 CEO 的正是樂視 CEO 的助理,樂視在 2015 年上半年發表了超級汽車計畫。  

  Faraday 研發副總裁、Tesla 前總監 Nick Sampson 表示,市面上的汽車已經不能滿足用戶的需求,Faraday 將提供最智慧化的電動車,幫助用戶與外部世界連接,這位高階主管拒絕公開 Faraday 的投資方。Nick Sampson 於 2012 年 1 月從 Tesla 離職,對於他的離職,Tesla CEO Elon Musk 曾公開表示是他勸 Nick Sampson 離職的,因為 Tesla 沒有適合他的職位。   從團隊構成到產品戰略,這家神秘新創公司直指 Tesla,在公司的名稱上也與 Tesla 有異曲同工之妙,Tesla 的名字來自於交流電發明者 Nikola Tesla,而 Faraday 的名字則是來自電磁感應的發現者 Michael Faraday。

(本文授權轉載自《》─〈〉)

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

【其他文章推薦】

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

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

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

利用爬蟲爬取LOL官網上皮膚圖片

  今天在瀏覽網頁時,看到一篇很有意思的文章,關於網絡爬蟲的。該文章是講述如何利用request爬取英雄聯盟官網皮膚圖片。看過文章后覺得挺有用的,把代碼拿過來運行了一下,果真爬取成功。下面給大家分享一下代碼。

  首先得利用cmd命令指示符安裝requests庫,json,re,time。

  安裝完成后,第一步是獲取英雄ID從而為先面判決URL作準備。

def getLOLImages():
    header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'}
    url_js = 'http://lol.qq.com/biz/hero/champion.js'
    #獲取JS源代碼 Str bytes
    res_js = requests.get(url_js).content
    #轉碼 轉成字符串
    html_js = res_js.decode()
    #正則表達式
    req = '"keys":(.*?),"data"'
    list_js = re.findall(req,html_js)
    #轉成dict
    dict_js = json.loads(list_js[0])
    # print(type(dict_js))
    #定義圖片列表
    pic_list = []
    for key in dict_js:
        # print(key)#英雄ID

第二步就是拼接URL了,通過發現英雄皮膚url的取名方式,我們可以方向最後的数字是不同的。讓后通過此方法來獲取圖片地址。

for i in range(20):
    number = str(i)
    if len(number) == 1:
        hero_num = "00"+number
    elif len(number) == 2:
        hero_num = "0"+number
    numstr = key+hero_num
    url = "http://ossweb-img.qq.com/images/lol/web201310/skin/big"+numstr+".jpg"
    #http://ossweb-img.qq.com/images/lol/web201310/skin/big81000.jpg
    pic_list.append(url)

第三步是獲取圖片名稱,path那行是放置圖片的地址,注意結尾的\\不能丟。

list_filepath = []
    path = "D:\Pycharmdaima\Pachong\LOLTU\\"
for name in dict_js.values():
    for i in range(20):
        file_path = path+name+str(i)+'.jpg'
        list_filepath.append(file_path)

第四步就是下載圖片了。

n = 0
for picurl in pic_list:
    res = requests.get(picurl)
    n += 1
    #獲取狀態碼
    if res.status_code == 200:
        print("正在下載%s"%list_filepath[n])
        time.sleep(1)
        with open(list_filepath[n],'wb') as f:
            f.write(res.content)

最後,調用一下getLOLImages()方法

getLOLImages()

  注意,我第一次用了源碼,後來發現運行太慢,檢查一下源碼后發現代碼末尾調用了一個time.sleep()方法。這樣是為了限制爬取速度,避免速度過快被網站發現而中斷。經過調試,我中途暫停代碼運行,將sleep()方法註釋掉,爬取速度果然加快,而且沒有中斷。

  下面是我的爬取成果:

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

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

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

.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<int> func = 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(16, 16);
ThreadPool.SetMinThreads(8, 8);

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 是電子產業重要的元件?

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

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

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