環境資訊中心綜合外電;姜唯 編譯;林大利 審校
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※別再煩惱如何寫文案,掌握八大原則!
※教你寫出一流的銷售文案?
※超省錢租車方案
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※回頭車貨運收費標準
居家、公司行號垃圾清運、廢棄物處理、大型家具回收,服務快速,包月及計重或計桶供客戶選擇,合法登記的清潔公司、廢棄物清除許可,專業技術人員及專業廢棄物清運車輛
摘錄自2020年05月08日TVBS新聞網全球報導
全球進入「封城新時代」,人類減少外出,大大改善了地球環境,不過塑膠污染卻愈來愈嚴重。美國各州,為了防止重複使用的購物袋傳播病毒,開放使用塑膠袋,許多環保措施因此停擺。而宅經濟正夯,網購的貨品包裝,也製造出大量垃圾。
加州塑膠袋全面啟用,當地原先規定購買塑膠袋必須支付10美分,大約台幣3元錢,如今禁令暫停60天,因為衛生安全問題,暫時大於環保問題。就連舊金山,身為全美最先禁用塑膠袋的城市之一,也已經宣布,禁止消費者攜帶自己的環保杯、環保袋等用品到店內。
無論是外出購物,還是網購,似乎怎麼做都會製造塑膠廢棄物,知名零垃圾專家就教大家運用「5R方針」,包括Refuse拒絕垃圾、Reduse減量、Reuse重複使用、Recycle回收,以及Rot把廚餘做成堆肥。零廢棄專家BeaJohnson:「這5R在世界各地都適用,不管你身處什麼情況,包括全球大流行疫情期間也是。」
公害污染
污染治理
國際新聞
美國
塑膠袋
塑膠袋禁用政策
一次性包裝
一次性塑膠袋
廢棄物
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※別再煩惱如何寫文案,掌握八大原則!
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※超省錢租車方案
※教你寫出一流的銷售文案?
※網頁設計最專業,超強功能平台可客製化
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※台中搬家遵守搬運三大原則,讓您的家具不再被破壞!
摘錄自2020年5月10日自由時報報導
印度東南部維沙卡帕特南(Visakhapatnam)7日時,南韓LG集團子公司的聚合物工廠發生苯乙烯(styrene)氣體大規模外洩,據外媒,目前已知最少11死,逾千人住院,現仍有數百人在院內接受治療。當地時間週六,憤怒的村民將受害者遺體陳列於工廠大門前,要求工廠即刻關閉,同時逮捕工廠最高管理階層。
這間工廠屬於「南韓樂金聚合物(LG Polymers)」為南韓最大化工企業「LG化學(LG Chem Ltd)」的子公司。同日該公司發表聲明向受害者道歉,聲明也透露,初步調查結果證實,這場悲劇是由苯乙烯儲存槽蒸氣外洩而引起的。
苯乙烯被廣泛用於塑膠及橡膠製品製造,據我國勞動部職業安全衛生署2015「職業性苯乙烯、二苯乙烯中毒認定參考指引」,吸入或食入高濃度苯乙烯可能刺激呼吸道,引起昏睡、頭痛、精神混亂、協調感喪失及意識不清等症狀,若食入或在嘔吐下吸入肺部,可能導致嚴重肺組織損傷,引起肺組織壞死,甚至致死。
公害污染
空氣污染
毒物
污染治理
國際新聞
印度
化學工廠
化學氣體
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※教你寫出一流的銷售文案?
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※回頭車貨運收費標準
※別再煩惱如何寫文案,掌握八大原則!
※超省錢租車方案
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※推薦台中搬家公司優質服務,可到府估價
摘錄自2020年5月9日自由時報報導
武漢肺炎(新型冠狀病毒疾病,COVID-19)衝擊全球,不僅導致近400萬人染疫,與人類親近的犬、貓,甚至貂和大型貓科動物都有確診案例;專家則警告,雖目前還未有正式的科學期刊證實,但有研究顯示武漢肺炎可感染的潛在生物範圍恐擴及「鯨魚」。
根據加國媒體《Nunatsiaq news 》報導,目前科學界認為其他動物也會感染武漢肺炎的原因在於,牠們呼吸道細胞表面的蛋白質類似武漢肺炎的受體ACE2,當武漢肺炎病毒進入體內時,會經由ACE2進入細胞並開始複製,進而侵入呼吸道,造成感染。日前加利福尼亞大學戴維斯分校的研究人員創建了一份ACE2受體的動物清單,雖目前仍須更多研究佐證,但專家恩威亞(Martin Nweeia)日前在威爾遜國際學者中心的討論會上強調,北極海域的海洋哺乳動物有感染武漢肺炎的可能性。
雖然人類多透過飛沫感染到武漢肺炎,但根據國際文獻指出,人的糞便、尿液也會殘留病毒,當這些含有病毒的廢水排入水中時,有可能導致某些動物感染,雖然病毒可能被海水中的某些物質破壞,但是北極海有多個鹹淡水入口,以及因全球暖化冰川徑流和夏季冰融化增加了淡水系統,可能影響海洋生物以及病毒的存活。
生活環境
生態保育
物種保育
生物多樣性
國際新聞
武漢肺炎
鯨魚
動物與大環境變遷
公共衛生
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※超省錢租車方案
※別再煩惱如何寫文案,掌握八大原則!
※回頭車貨運收費標準
※教你寫出一流的銷售文案?
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※網頁設計最專業,超強功能平台可客製化
摘錄自2020年5月10日中央通訊社報導
日本境內2019冠狀病毒疾病(COVID-19)疫情延燒,連帶衝擊到北海道酪農生乳銷量,讓北海道知事鈴木直道推出「牛奶挑戰」,呼籲民眾多喝牛奶,增加牛奶或優格購買量。日本放送協會(NHK)報導,鈴木直道在一段影片中單手拿著一杯牛奶,然後一口氣喝完,這個稱為「牛奶挑戰」的活動,希望能提升牛奶消費量。
日本境內受到疫情影響,學校臨時停課,所以沒有提供營養午餐,讓牛奶消費量下滑;民眾避免外出及出遊,也造成牛奶製品的冰淇淋、蛋糕等甜點銷量銳減。牛奶消費量減少直接衝擊酪農,而北海道的農業生產額中,酪農占了4成,在北海道農產占有相當重要地位。
一般來說,需求減少可以減產因應,但事實上不然,北海道江別市酪農川口谷仁說,每天要幫牛擠3次奶,如果不這麼做,牛就會生病,所以無法停止擠奶。加上北海道每年5月到6月的氣候,對牛來說是最舒服的時候,也是一年中最容易增加生乳產量的時期。而再這樣下去的話,最糟的情況就是造成廠商無法再收購,每天固定生產的生乳將不得不廢棄。
生活環境
國際新聞
日本
北海道
酪農
牛奶
武漢肺炎
疫情下的食衣住行
公共衛生
經濟動物
動物福利
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計最專業,超強功能平台可客製化
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※回頭車貨運收費標準
※推薦評價好的iphone維修中心
※教你寫出一流的銷售文案?
※台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!
※台中搬家公司費用怎麼算?
摘錄自2020年5月11日中央社報導
為了避免武漢肺炎疫情擴大,泰國從3月25日關閉所有的國家公園,例如知名的考艾國家公園(Khao Yai National Park)是開園58年以來第一次閉園,而且數條穿過國家公園的公路也因此封閉。
泰國公視(Thai PBS)報導,泰國自然資源和環境部(Ministry of Natural Resources and Environment)部長烏拉沃(Varawut Silpa-archa)日前表示,過去兩個月國家公園因為疫情閉園,反讓許多野生動物再生。
烏拉沃表示,受到這樣狀況的啟發,自然資源和環境部未來準備讓全泰國157個國家公園每年閉園三個月,他要求國家公園局(Department of National Parks, Wildlife and Plant Conservation)在一切恢復正常後,研擬適合的閉園時間表。
泰媒經理人日報(Manager Daily)報導,國家公園局局長譚亞(Thanya Netithamkul)表示,國家公園局已經和相關單位討論過,會要求各個國家公園準備相關計畫。
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※回頭車貨運收費標準
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※推薦評價好的iphone維修中心
※教你寫出一流的銷售文案?
※台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!
※台中搬家遵守搬運三大原則,讓您的家具不再被破壞!
開篇先簡單介紹一下自己,雙非本科,大三在讀,通信學院物聯網工程專業。這個專業的發展方向大致分為軟、硬件兩種,大二的時候感覺自己更喜歡軟件方面,也就開始學習比較常用的 Java。
到了今年三月,開始投簡歷,投的都是 Java 開發工程師崗,參与春招實習生招聘,想體驗一下筆試、面試的過程,最好能拿到實習offer。
春招基本結束了,算是搭上了春招的末班車,被春招支配的恐懼也可以告一段落了,藉此機會梳理一下我的春招歷程。
剛開始心態很差,每過一面就會感覺很放鬆,可能會開心一下,這種開心的時候可能就不是很用心的在學習。
然而每掛一面就會非常沮喪,心情很低落,連續幾天都會整理不好心情繼續沉浸在學習中。還會懷疑自己是不是不行,是不是能力不夠,是不是….
心情起起落落,甚至在每面完一場,都會隔幾分鐘就刷新官網,看下流程情況,看下自己是不是掛掉了。焦灼的心,顫抖的手,浮躁的狀態。
完完全全被焦慮和恐懼給支配,沒心思學習,感覺自己整個思路、情緒、狀態都到了一個極點,而且是自己沒辦法突破的極點。
被恐懼支配比恐懼本身恐懼多了,而且後勁十足。
我苦苦在尋找一個突破口,但一直沒能找到如何突破。如果找不到這個突破口,接下來的春招之路感覺很難走下去。
一次偶然在朋友圈看到同學轉發一篇文章,是說面試介紹的 當你面試“自我介紹”還在我是XXX時,看到這篇文章的同學們已經拿到了offer… ,看是關於面試的文章,就點進去看了。
看這篇文章確實補充了我很多盲點,於是我就點進去看了下其他的文章,比如這篇 學會龍叔這套面試秘訣,一套大招帶走面試官 ,發現裏面可以加交流群 和 加作者微信。
還看到龍叔給粉絲輔導簡歷,於是我就鼓起勇氣加了龍叔微信,把自己的情況描述了下。抱着試試的態度,沒想到龍叔非常認真的回答了我,而且還在粉絲交流群里給大家說了。
非常幸運的遇到了龍叔,他告訴我,
面試完就不要總是等待結果,面試就像期末考,考完我們都不會再去翻書了。面完了,結果就不在我們考慮範圍之內了,要為下一場準備,也不能寄希望於一個公司,應該把心思放在複習和準備上。時刻保持自己的面試狀態,充滿鬥志、不要灰心。因為 offer 是需要流程的,不是面完就發,多準備,多面,之後就是收割 offer 的事情。天天憂心忡忡的,實在無濟於事,完全是浪費自己的時間。
我聽完犹如醍醐灌頂,受益匪淺,麻溜兒地寫在便簽紙上,貼在眼前,提醒自己。
人總有失意和遇到困難想不通的時候,而這時候能讓我的思想從短路變為通路,非常感謝龍叔。
之後四月份,身邊同學陸陸續續有收到 offer 的,去牛客網每次刷新的時候,也都是喜提校招或者實習 offer的記錄帖,羡慕、恰檸檬之餘。
我為自己還沒有理想的offer 感到發愁,又到了浮躁的一個新階段。這個階段雖說是浮躁,但是比起剛開始那一堵牆,已經好很多了。
會和朋友相互鼓勵,相互吐槽失敗的面試,心情 down 的時候聽聽大張偉的《陽光彩虹小白馬》 “你就是最強噠最棒噠最亮噠最發光噠”,努力讓自己平和、快樂,強行相信自己。很快就能調整好自己的狀態,繼續投入到戰鬥中。
心態太重要了,只有心態好了,複習才能更加有效率。
這兩個月的面試中,讓我自己印象深刻的是騰訊三面,可能是傳說中的壓力面之類的。
當時操作系統學的不好,說明了之後,面試官還是在操作系統這方面窮追不舍地發問,從一開始的語氣溫柔、帶着笑意,到後來漸漸嚴肅、帶着凶意,與此同時我也意識到這最後一輪技術面多半是涼透了,要和我 say byebye了。
最後面試官甚至問 你到底有沒有學過操作系統?你是女生,為什麼要學開發?
當時的面試,我沒控制住情緒,為自己的菜流下了委屈的淚水
其實也沒什麼委屈的,畢竟菜是原罪,哈哈哈。可能因為人生第一回總監面,沒見過這種大場面的原因吧,還是要見多識廣啊。
事後反思,這樣實在是不合適,這是頂不住壓力的表現,面試官希望看到的,應該是沉着冷靜的,嘗試去解決問題的求職者,而不是這樣愛哭鼻子的。
經歷這近三個月的面試,從開始自我介紹都結巴,到現在可以心跳正常地和面試官交流,收穫還是蠻多的。
我感到實力才是硬道理,結果的決定權在公司手裡,作為求職者,我們總是會被置於與其他同樣水平的人作比較的地位,只能不斷提高實力,才可能脫穎而出。
保持平和的心態會帶來一些好的運氣,還有就是堅持下去,最後一定會收穫好結果的。
從簡歷篩選、筆試、輪輪面試,一步一步過關,每次面試過程會錄音,之後復盤,通過復盤去看自己當時為什麼沒有回答上來,為什麼沒有收到面試官的青睞。
通過復盤,把不會的問題都搞明白,把該加分沒加上的,在後續的面試一定加上。面試完需要儘快查漏補缺,保持心態,堅持下去。
春季實習招聘還是比較寬容的,大廠也沒有因為我學歷不出色而不給面試機會,而且很多家的面試體驗還是很不錯的,有的面試官會引導我、會糾正我的錯誤、給予建議。
即使最後沒有通過,也是學到了一些東西,面試本身就是一種學習。
面試最好的狀態是和面試官交流,而不是硬生的回答。
最後希望秋招時,我可以擁有更平和的心態和更紮實的基礎,收穫自己心儀的offer~ ,也希望和我一起奮鬥的你們都能找到滿意的offer。
這裏列出遇到的面試中高頻的考點(被問到三次以上的那種~):
這些是非常高頻的面試題,還有一些常規的,就不一一列舉了。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!
※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※教你寫出一流的銷售文案?
※別再煩惱如何寫文案,掌握八大原則!
首先我們來看一段控制台應用代碼:
class Program
{
static async Task Main(string[] args)
{
System.Console.WriteLine($"Thread Id is Thread:{Thread.CurrentThread.ManagedThreadId},Is Thread Pool:{Thread.CurrentThread.IsThreadPoolThread}");
var result = await ExampleTask(2);
System.Console.WriteLine($"Thread Id is Thread:{Thread.CurrentThread.ManagedThreadId},Is Thread Pool:{Thread.CurrentThread.IsThreadPoolThread}");
System.Console.WriteLine(result);
Console.WriteLine("Async Completed");
}
private static async Task<string> ExampleTask(int Second)
{
await Task.Delay(TimeSpan.FromSeconds(Second));
return $"It's Async Completed in {Second} seconds";
}
}
輸出結果
Thread Id is Thread:1,Is Thread Pool:False
Thread Id is Thread:4,Is Thread Pool:True
It's Async Completed in 2 seconds
Async Completed
如果這段代碼在WPF運行,猜猜會輸出啥?
private async void Async_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine($"Thread Id is Thread:{Thread.CurrentThread.ManagedThreadId},Is Thread Pool:{Thread.CurrentThread.IsThreadPoolThread}");
var result= await ExampleTask(2);
Debug.WriteLine($"Thread Id is Thread:{Thread.CurrentThread.ManagedThreadId},Is Thread Pool:{Thread.CurrentThread.IsThreadPoolThread}");
Debug.WriteLine(result);
Debug.WriteLine("Async Completed");
}
private async Task<string> ExampleTask(int Second)
{
await Task.Delay(TimeSpan.FromSeconds(Second));
return $"It's Async Completed in {Second} seconds";
}
輸出結果:
Thread Id is Thread:1,Is Thread Pool:False
Thread Id is Thread:1,Is Thread Pool:False
It's Async Completed in 2 seconds
Async Completed
這時候你肯定是想說,小朋友,你是否有很多問號????,我們接下看下去
首先我們知道async await 異步函數本質是狀態機,我們通過反編譯工具dnspy,看看反編譯的兩段代碼是否有不同之處:
控制台應用:
internal class Program
{
[DebuggerStepThrough]
private static Task Main(string[] args)
{
Program.<Main>d__0 <Main>d__ = new Program.<Main>d__0();
<Main>d__.args = args;
<Main>d__.<>t__builder = AsyncTaskMethodBuilder.Create();
<Main>d__.<>1__state = -1;
<Main>d__.<>t__builder.Start<Program.<Main>d__0>(ref <Main>d__);
return <Main>d__.<>t__builder.Task;
}
[DebuggerStepThrough]
private static Task<string> ExampleTask(int Second)
{
Program.<ExampleTask>d__1 <ExampleTask>d__ = new Program.<ExampleTask>d__1();
<ExampleTask>d__.Second = Second;
<ExampleTask>d__.<>t__builder = AsyncTaskMethodBuilder<string>.Create();
<ExampleTask>d__.<>1__state = -1;
<ExampleTask>d__.<>t__builder.Start<Program.<ExampleTask>d__1>(ref <ExampleTask>d__);
return <ExampleTask>d__.<>t__builder.Task;
}
[DebuggerStepThrough]
private static void <Main>(string[] args)
{
Program.Main(args).GetAwaiter().GetResult();
}
}
WPF:
public class MainWindow : Window, IComponentConnector
{
public MainWindow()
{
this.InitializeComponent();
}
[DebuggerStepThrough]
private void Async_Click(object sender, RoutedEventArgs e)
{
MainWindow.<Async_Click>d__1 <Async_Click>d__ = new MainWindow.<Async_Click>d__1();
<Async_Click>d__.<>4__this = this;
<Async_Click>d__.sender = sender;
<Async_Click>d__.e = e;
<Async_Click>d__.<>t__builder = AsyncVoidMethodBuilder.Create();
<Async_Click>d__.<>1__state = -1;
<Async_Click>d__.<>t__builder.Start<MainWindow.<Async_Click>d__1>(ref <Async_Click>d__);
}
[DebuggerStepThrough]
private Task<string> ExampleTask(int Second)
{
MainWindow.<ExampleTask>d__3 <ExampleTask>d__ = new MainWindow.<ExampleTask>d__3();
<ExampleTask>d__.<>4__this = this;
<ExampleTask>d__.Second = Second;
<ExampleTask>d__.<>t__builder = AsyncTaskMethodBuilder<string>.Create();
<ExampleTask>d__.<>1__state = -1;
<ExampleTask>d__.<>t__builder.Start<MainWindow.<ExampleTask>d__3>(ref <ExampleTask>d__);
return <ExampleTask>d__.<>t__builder.Task;
}
[DebuggerNonUserCode]
[GeneratedCode("PresentationBuildTasks", "4.8.1.0")]
public void InitializeComponent()
{
bool contentLoaded = this._contentLoaded;
if (!contentLoaded)
{
this._contentLoaded = true;
Uri resourceLocater = new Uri("/WpfApp1;component/mainwindow.xaml", UriKind.Relative);
Application.LoadComponent(this, resourceLocater);
}
}
private bool _contentLoaded;
}
我們可以看到完全是一致的,沒有任何區別,為什麼編譯器生成的代碼是一致的,卻會產生不一樣的結果,我們看看創建和啟動狀態機代碼部分的實現:
public static AsyncVoidMethodBuilder Create()
{
SynchronizationContext synchronizationContext = SynchronizationContext.Current;
if (synchronizationContext != null)
{
synchronizationContext.OperationStarted();
}
return new AsyncVoidMethodBuilder
{
_synchronizationContext = synchronizationContext
};
}
[DebuggerStepThrough]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Start<[Nullable(0)] TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine
{
AsyncMethodBuilderCore.Start<TStateMachine>(ref stateMachine);
}
[DebuggerStepThrough]
public static void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine
{
if (stateMachine == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.stateMachine);
}
Thread currentThread = Thread.CurrentThread;
Thread thread = currentThread;
ExecutionContext executionContext = currentThread._executionContext;
ExecutionContext executionContext2 = executionContext;
SynchronizationContext synchronizationContext = currentThread._synchronizationContext;
try
{
stateMachine.MoveNext();//狀態機執行代碼
}
finally
{
SynchronizationContext synchronizationContext2 = synchronizationContext;
Thread thread2 = thread;
if (synchronizationContext2 != thread2._synchronizationContext)
{
thread2._synchronizationContext = synchronizationContext2;
}
ExecutionContext executionContext3 = executionContext2;
ExecutionContext executionContext4 = thread2._executionContext;
if (executionContext3 != executionContext4)
{
ExecutionContext.RestoreChangedContextToThread(thread2, executionContext3, executionContext4);
}
}
}
在這裏總結下:
同樣的這裏貌似沒能獲取到原因,但是有個很關鍵的地方,就是Create函數為啥要獲取當前同步執行上下文,之後我從MSDN找到關於SynchronizationContext
的介紹,有興趣的朋友可以去閱讀以下,以下是各個.NET框架使用的SynchronizationContext:
| SynchronizationContext | 默認 |
|---|---|
| WindowsFormsSynchronizationContext | WindowsForm |
| DispatcherSynchronizationContext | WPF/Silverlight |
| AspNetSynchronizationContext | ASP.NET |
我們貌似已經一步步接近真相了,接下來我們來看看DispatcherSynchronizationContext
首先來看看DispatcherSynchronizationContext類的比較關鍵的幾個函數實現:
public DispatcherSynchronizationContext(Dispatcher dispatcher, DispatcherPriority priority)
{
if (dispatcher == null)
{
throw new ArgumentNullException("dispatcher");
}
Dispatcher.ValidatePriority(priority, "priority");
_dispatcher = dispatcher;
_priority = priority;
SetWaitNotificationRequired();
}
//同步執行
public override void Send(SendOrPostCallback d, object state)
{
if (BaseCompatibilityPreferences.GetInlineDispatcherSynchronizationContextSend() && _dispatcher.CheckAccess())
{
_dispatcher.Invoke(DispatcherPriority.Send, d, state);
}
else
{
_dispatcher.Invoke(_priority, d, state);
}
}
//異步執行
public override void Post(SendOrPostCallback d, object state)
{
_dispatcher.BeginInvoke(_priority, d, state);
}
我們貌似看到了熟悉的東西了,Send函數調用Dispatcher的Invoke函數,Post函數調用Dispatcher的BeginInvoke函數,那麼是否WPF執行異步函數之後會調用這裏的函數嗎?我用dnspy進行了調試:
我通過調試之後發現,當等待執行完整個狀態機的之後,也就是兩秒后跳轉到該Post函數,那麼,我們可以將之前的WPF那段代碼大概可以改寫成如此:
private async void Async_Click(object sender, RoutedEventArgs e)
{
//async生成狀態機的Create函數。獲取到UI主線程的同步執行上下文
DispatcherSynchronizationContext synchronizationContext = (DispatcherSynchronizationContext)SynchronizationContext.Current;
//UI主線程執行
Debug.WriteLine($"Thread Id is Thread:{Thread.CurrentThread.ManagedThreadId},Is Thread Pool:{Thread.CurrentThread.IsThreadPoolThread}");
//開始在狀態機的MoveNext執行該異步操作
var result= await ExampleTask(2);
//等待兩秒,異步執行完成,再在同步上下文異步執行
synchronizationContext.Post((state) =>
{
//模仿_dispatcher.BeginInvoke
Debug.WriteLine($"Thread Id is Thread:{Thread.CurrentThread.ManagedThreadId},Is Thread Pool:{Thread.CurrentThread.IsThreadPoolThread}");
Debug.WriteLine(result);
Debug.WriteLine("Async Completed");
},"Post");
}
輸出結果:
Thread Id is Thread:1,Is Thread Pool:False
Thread Id is Thread:1,Is Thread Pool:False
It's Async Completed in 2 seconds
Async Completed
也就是asyn負責生成狀態機和執行狀態機,await將代碼分為兩部分,一部分是異步執行狀態機部分,一部分是異步執行完之後,通過之前拿到的DispatcherSynchronizationContext,再去異步執行接下來的部分。我們可以通過dnspy調試DispatcherSynchronizationContext的 _dispatcher字段的Thread屬性,知道Thread為UI主線程,而同步界面UI控件的時候,也就是通過Dispatcher的BeginInvoke函數去執行同步的
Task有個ConfigureAwait方法,是可以設置是否對Task的awaiter的延續任務執行原始上下文,也就是為true時,是以一開始那個UI主線程的DispatcherSynchronizationContext執行Post方法,而為false,則以await那個Task裏面的DispatcherSynchronizationContext執行Post方法,我們來驗證下:
我們將代碼改為以下:
private async void Async_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine($"Thread Id is Thread:{Thread.CurrentThread.ManagedThreadId},Is Thread Pool:{Thread.CurrentThread.IsThreadPoolThread}");
var result= await ExampleTask(2).ConfigureAwait(false);
Debug.WriteLine($"Thread Id is Thread:{Thread.CurrentThread.ManagedThreadId},Is Thread Pool:{Thread.CurrentThread.IsThreadPoolThread}");
Debug.WriteLine(result);
Debug.WriteLine($"Async Completed");
}
輸出:
Thread Id is Thread:1,Is Thread Pool:False
Thread Id is Thread:4,Is Thread Pool:True
It's Async Completed in 2 seconds
Async Completed
結果和控制台輸出的一模一樣,且通過dnspy斷點調試依舊進入到DispatcherSynchronizationContext的Post方法,因此我們也可以證明我們上面的猜想,而且默認ConfigureAwait的參數是為true的,我們還可以將異步結果賦值給UI界面的Text block:
private async void Async_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine($"Thread Id is Thread:{Thread.CurrentThread.ManagedThreadId},Is Thread Pool:{Thread.CurrentThread.IsThreadPoolThread}");
var result= await ExampleTask(2).ConfigureAwait(false);
Debug.WriteLine($"Thread Id is Thread:{Thread.CurrentThread.ManagedThreadId},Is Thread Pool:{Thread.CurrentThread.IsThreadPoolThread}");
this.txt.Text = result;//修改部分
Debug.WriteLine($"Async Completed");
}
拋出異常:
調用線程無法訪問此對象,因為另一個線程擁有該對象
補充
推薦林大佬的一篇文章,也講的也簡潔透徹C# dotnet 自己實現一個線程同步上下文
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
※回頭車貨運收費標準
作者:HelloGitHub-小魚乾
摘要:最佳實踐,又名 best-practices,是 GitHub 常見的項目名,也是本周 Trending 關鍵詞。25 年 Python 開發經驗的 David Beazley 撰寫的 practical-python 開局並獲得了超 1k 的 star,而老項目 Node.js 最佳實踐在六月也開啟了更新模式,持續更新 Node.js 性能實踐篇。卡內基梅隆大學開源的 Penrose 一個可將複雜的數學符號轉換為各種風格的簡單圖表的項目無疑是數據圖表的最佳實踐…
以下內容摘錄自微博@HelloGitHub 的 GitHub Trending,選項標準:新發布 | 實用 | 有趣,根據項目 release 時間分類,發布時間不超過 7 day 的項目會標註 New,無該標誌則說明項目 release 超過一周。由於本文篇幅有限,還有部分項目未能在本文展示,望周知
本周 star 增長數:7550+
New CnC_Remastered_Collection 收錄了遊戲公司 EA 發布的《命令與征服》和《紅色警戒》原作源代碼。開源的代碼不涉及遊戲引擎和遊戲素材,只包括 TiberianDawn.dll 和 RedAlert.dll 的源代碼,開源的 DLL 可幫助玩家設計地圖、創建自定義單位、替換藝術作品,以及更改遊戲邏輯和編輯數據。
GitHub 地址→https://github.com/electronicarts/CnC_Remastered_Collection
本周 star 增長數:1050+
Newpractical-python 是一名有 25 年 Python 開發經驗的程序員撰寫的實用 Python 指南。無需任何 Python 開發經驗,非 Python 程序員也可以學習下該項目。
GitHub 地址→https://github.com/dabeaz-course/practical-python
本周 star 增長數:1700+
robotgo 是 Golang 跨平台自動化系統,控制鍵盤鼠標位圖和讀取屏幕,窗口句柄以及全局事件監聽。支持 Windows、Linux、macOS。
GitHub 地址→https://github.com/go-vgo/robotgo
本周 star 增長數:3700+
New Docker-OSX 是一個能讓你在 Docker 上跑 Mac 的項目,它支持近乎原生的 OSX-KVM。
GitHub 地址→https://github.com/sickcodes/Docker-OSX
本周 star 增長數:1550+
Penrose 一個只需在純文本中輸入數學符號就可以創建漂亮的圖表的工具。這樣做的目的是為了方便非專家專心研究更有有挑戰性的技術,而非花精力研究如何創建和探索高質量圖上。
GitHub 地址→https://github.com/penrose/penrose
本周 star 增長數:1000+
Deepfakes 是一種利用機器學習中的深度學習實現深度視頻換臉的技術。這種技術在特定的場合下可以做出非常逼真自然的換臉視頻。
GitHub 地址→https://github.com/iperov/DeepFaceLab
本周 star 增長數:500+
go-interview 收錄了用 Go 解決技術面試的方法。
GitHub 地址→https://github.com/public-apis/public-apis
本周 star 增長數:1300+
ZY-Player 是一個跨平台桌面端視頻資源播放器,簡潔無廣告且顏值高。特性:
GitHub 地址→https://github.com/Hunlongyu/ZY-Player
本周 star 增長數:1100+
nodebestpractices 是一個 Node.js 最佳實踐列表,收錄 5 篇項目結構實踐、11 篇錯誤處理實踐、12 篇代碼風格實踐、13 篇測試和整體質量實踐、19 篇生產實踐、25 篇安全實踐及 2 篇性能實踐,項目持續更新中,如果你對 Node.js 最佳實踐用有心得不妨和項目作者交流下。
GitHub 地址→https://github.com/goldbergyoni/nodebestpractices
本周 star 增長數:800+
New蘋果推出全新開源項目——Password Manager Resources,它集成蘋果 iCloud Keychain Password Manager,可以讓密碼管理 App 開發者為特定網站創建可以兼容的強密碼,這個機制與 iCloud 鑰匙串密碼管理器相同。
GitHub 地址→https://github.com/apple/password-manager-resources
在本期主題模塊,小魚乾這裏選取了 3 個 Python 性能相關的小工具,希望能提高你的開發效率。
Memory Profiler 一聽名字就是一個 Python 程序內存佔用分析工具,它可以監視一個進程的內存消耗,甚至可以一行一行的分析 Python 程序的內存消耗。Memory Profiler 由 Python 實現,用戶可選 psutil 模塊(強烈推薦)作為依賴,會分析得更快。
GitHub 地址→https://github.com/pythonprofilers/memory_profiler
Sentry,一款免費開源的 Python 實時異常監控平台。Sentry 採用 C/S 模式,服務器端通過 Python 實現,同時提供 web 管理頁面,支持從任何語言、任何應用程序發送事件。一個成熟的服務必要的一環就是異常告警,Sentry 可以幫你及時知道服務非預期的異常。
GitHub 地址→https://github.com/getsentry/sentry
scalene 一個 Python 的高性能 CPU 和內存分析器。Scalene 很快、佔用資源少、展示信息全面,可用來排查、優化 Python 程序佔用資源過多等問題。
GitHub 地址→https://github.com/emeryberger/scalene
以上為 2020 年第 23 個工作周的 GitHub Trending 如果你 Pick 其他好玩、實用的 GitHub 項目,記得來 HelloGitHub issue 區和我們分享下喲
HelloGitHub 交流群現已全面開放,添加微信號:HelloGitHub 為好友入群,可同前端、Java、Go 等各界大佬談笑風生、切磋技術~
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※南投搬家公司費用需注意的眉眉角角,別等搬了再說!
※教你寫出一流的銷售文案?
※回頭車貨運收費標準
※別再煩惱如何寫文案,掌握八大原則!
摘錄自2020年5月12日自由時報報導
印度的二氧化碳排放量出現40年來首次下降,根據印度國家電力公司的數據,二氧化碳排放量在3月份下降了15%,4月份預計可下降30%。其中以燃煤減量為最主要的影響。
截至今年3月的財政年度報告,煤炭的運輸量下降約2%;而火力發電在過去10年中每年增長75%,石油消費需求也同樣下降。根據環境網站「Carbon Brief」的分析,用電下降和再生能源的競爭削弱了國內對化石燃料的需求,加上武漢肺炎(新型冠狀病毒疾病,Covid-19)疫情爆發,印度國內實施全境封鎖,成功改變碳排放量增長的趨勢。
據報導,印度今年3月石油的消耗量下降18%,再生能源供應在過去1年中則有所增加。根據國際能源署(International Energy Agency,IEA)4月底發布的數據,今年第一季度全球燃煤使用量也下降了8%。但分析師則提醒,化石燃料使用率的下降可能不會持續,分析師指出,當全球疫情趨緩,各國重啟經濟,排放量將再次飆升。
公害污染
空氣污染
能源議題
再生能源
污染治理
能源轉型
國際新聞
印度
碳排放
武漢肺炎
化石燃料
疫情看氣候與能源
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計最專業,超強功能平台可客製化
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※回頭車貨運收費標準
※推薦評價好的iphone維修中心
※教你寫出一流的銷售文案?
※台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!
※台中搬家公司費用怎麼算?