發表文章

目前顯示的是 6月, 2017的文章

[C#] using multiple await in async method for searching certain string in txt files

這次的目標是要在async方法中執行多階段的多執行緒, 在第一個執行緒中過濾出符合時間範圍的文字檔,同時讓progressBar循環跑動,完成後顯示過濾出幾個檔案, 接下來在第二個執行緒中搜尋,檔案中是否有符合的字串,同時讓progressBar從0%隨著進度跑到100%。 第二個執行緒是在前一篇文章已經完成了,可是不知道為什麼progressBar都只會跑到99%附近,messageBox就跳出來了...不過這個可以過幾天再來研究。 第一個想法是寫一個Task.Factory.StartNew來做過濾檔案的動作,再加上ContinueWith來更新UI,不過照前面的寫法加進去之後,在Task前面還是要加上await,結果就是在async方法裡面有兩個await方法,只是感覺ContinueWith那邊有點冗長,也因此我就想試試第二個想法。 第二個想法是把要用多執行緒的方法,類別外面再包一個Task,變成Task<List<string>>。 我想在主函式中只要直接用這個方法,前面再加上await就可以了,可是在改寫方法的時候遇到了一點問題,函式傳回的值類型也需要是Task<List<string>>,而不能是List<string>。 後來又回去重新看了一下第一篇自己貼過的其他方法,既然一個async方法內可以放多個await,根本不用去改寫要開執行緒的方法...只要用await Task.Run或await Task.Factory.StartNew就可以了。 解法二 沒想到查到正確的方法以後,只花了兩天就可以有這麼多進展,前一次在研究多執行緒的時候好像搞了很久UI還是會鎖死。 下禮拜有空再來研究async/await的暫停或停止方法。 今天才注意到,async/await是.net 4.5才能用的語法...4.0用的要繼續查了

[C#] Using task to create a tool for searching string in files - 2

完成了第一步,在搜尋時UI不會鎖死以後,接下來想達成的目標是在搜尋時進度條能夠回報進度,從0%跑到100%。 參考: stack overflow 概念上應該是用兩層async/await方法,第一層方法是在所有搜尋動作完成後,回報工作完成顯示在UI上,到這裡跟上一篇文章的結果相同,但是在進入第一個動作以後的程式要做修改,呼叫的方法也加上async,並且在foreach內,檢查每一個檔案的方法前面加上await。 在stack overflow上參考的答案不知道為什麼在一個async方法中寫了兩次await,直接把程式碼貼到vs以後會出現錯誤,而vs提供的修正建議是在Task.Run 的匿名函式內的()前加上async,讓這個方法變成另一組async/await。 不過後來想想,寫成三層的async/await應該沒有什麼意義,在這裡只需要兩層就夠了,所以就改寫成了現在的版本,測試過應該沒什麼問題。 接下來的目標是想要寫出接續的非同步執行方法,用在取得資料夾中所有檔案的更新時間。 其實本來只是希望可以有用時間來篩選搜尋的檔案的功能,例如:只搜尋更新時間在一週內的檔案文字,結果我拿一萬五千多個檔案測試的時候,UI又鎖死了XD

[C#] Using task to create a tool for searching string in files

這次要來做多執行緒練習的題目是在多個文字檔中搜尋特定字串,目的是為了在找log的時候快一點。 雖然windows檔案管理員中就有提供這個功能(至少win8和win10都有),可是常常進度條常常會在看起來接近99%的地方停很久,或者是明明在txt檔中有搜尋的文字,搜尋結果卻是找不到檔案。 在這個練習中達成的目標包括: 用async/await方法進行搜尋的動作,搜尋期間UI介面會有循環式的進度條跑動,UI也不會鎖死。 用StreamReader讀取檔案內的文字,找到符合項目 主要的程式碼 參考資料就是前面幾篇的async/await用法

[C#] Example for using System.Threading.Tasks to release UI in heavy work

為了避免視窗程式在執行運算量大的作業時,視窗鎖死的狀況,正在學習如何使用多執行緒寫法來釋放UI。 下面是第一個試成功的方法。 參考: stack overflow 我是看完Sergey Brunov提供的解法以後才試成功的,不過繼續看後面提到的async/await,馬上發現有更簡單的用法...

[C#] Using async/await to release UI in heavy work

用async/await建立非同步執行方法的例子 這裡用的測試方法Test()就只是放一個跑很多次的for loop而已 參考: 點部落