1. 程式人生 > >Excel催化劑開源第8波-VSTO開發之非同步呼叫方法

Excel催化劑開源第8波-VSTO開發之非同步呼叫方法

在VSTO開發過程中,因其和普通的Winform開發有點差別,具體細節筆者也說不清楚,大概是VSTO的外掛是寄生在Excel中,不屬於獨立的程序之類的,其非同步方法呼叫時,未能如Winform那樣直接用await async非同步方法就結束,仍需要再作簡單的處理。

使用場景

在Excel上直接使用非同步方法,貌似有上述提及的問題,不像Winform程式那樣,需要Excel上調出窗體,再從窗體上作非同步方法的操作,直接呼叫的話,遇到使用者用鍵盤、滑鼠互動Excel操作會報錯。

Excel催化劑中有些操作與外部資源互動特別是外部網路訪問時,若不使用非同步方法,將會卡介面,使用者感覺宕機了一樣。

使用非同步方法後,可以有一些狀態資訊反饋給使用者知道程式還在執行,是十分有必要的。

以下舉例Excel催化劑批量下載檔案的功能。

先按鈕開啟一個窗體,具體程式碼如下:

        private void btnBatchDownLoadFile_Click(object sender, RibbonControlEventArgs e) { try { var result = MessageBox.Show(text: "是否需要在目標內容區域上生成超連結", caption: "生成超連結確認", buttons: MessageBoxButtons.YesNo); FormDownLoadFile form = new FormDownLoadFile(); if (result == DialogResult.Yes) { form.IsCreateHyperLink = true; } else { form.IsCreateHyperLink = false; } form.Show(); } catch (Exception ex) { Common.OutMsgError(ex); } } 
  批量下載檔案介面

窗體中供使用者配置一些資訊後,即可開始下載檔案,使用者點選下載後執行

        private async void btnOK_Click(object sender, EventArgs e) { var markColor = Utilities.RangeUtility.GetMarkColorToDstRange(srcDataValues); int totalNum = srcDataValues.Count(); int iLoop = 0; int rowOffset = int.Parse(this.cmbRowOffset.Text); int colOffset = int.Parse(this.cmbColOffset.Text); foreach (var item in srcDataValues) { iLoop++; string srcFilePath = item.Value2.ToString(); string dstFilePath; Excel.Range dstItemRange = item.Offset[rowOffset, colOffset]; if (dstItemRange.Value2 != null) { dstFilePath = dstItemRange.Value2.ToString(); //沒有後綴名時,標紅顏色返回讓使用者自行檢查 if (string.IsNullOrEmpty(Path.GetExtension(dstFilePath))) { item.Interior.Color = ColorTranslator.ToOle(markColor); dstItemRange.Interior.Color = ColorTranslator.ToOle(markColor); } else { WebClientEx webClient = new WebClientEx(3000); Uri uri = new Uri(srcFilePath); await webClient.DownloadFileTaskAsync(uri, dstFilePath); //執行緒間操作無效: 從不是建立控制元件的執行緒訪問它。 處理方法 Action<int, int, string> action = (i, n, s) => { this.lblDownLoadInfo.Text = $"正在下載的是第【{i}】/【{n}】個檔案\r\n檔名為:{s}"; }; Invoke(action,iLoop, totalNum, dstFilePath); if (this.IsCreateHyperLink) { dstItemRange.Hyperlinks.Add(Anchor: dstItemRange, Address: dstFilePath, TextToDisplay: dstFilePath); } } } else//當目標單元格沒有值時,標紅顏色返回讓使用者自行檢查 { item.Interior.Color = ColorTranslator.ToOle(markColor); dstItemRange.Interior.Color = ColorTranslator.ToOle(markColor); } } MessageBox.Show("下載完成!"); Action actionColseForm = () => { this.Close(); }; Invoke(actionColseForm); } 

以上的關鍵程式碼關鍵之處有
用webClient庫來下載,普通下載可滿足,重寫了它的超時時間
用await 關鍵字實現非同步方法下載。

                        WebClientEx webClient = new WebClientEx(3000);
                        Uri uri = new Uri(srcFilePath);
                        await webClient.DownloadFileTaskAsync(uri, dstFilePath);

若程式碼需要重新訪問窗體控制元件,需要用Action委託來處理下。

                        //執行緒間操作無效: 從不是建立控制元件的執行緒訪問它。 處理方法
                        Action<int, int, string> action = (i, n, s) =>
                            {
                                this.lblDownLoadInfo.Text = $"正在下載的是第【{i}】/【{n}】個檔案\r\n檔名為:{s}"; }; 

同樣地下載結束後,關閉窗體,也需要重新用委託的方式來關閉。

            Action actionColseForm = () => { this.Close(); };
            Invoke(actionColseForm);

結語

非同步方法呼叫這東西,筆者也是新手,裡面的原理也不甚完全知曉,也只是百度回來的程式碼能夠執行起來的水平。但此篇程式碼還是可以給大家帶來一些實質性的幫助,需要使用時,得勝一下程式碼即可。

因為VSTO的特殊性,可能這些問題,在專業程式猿群體中,不會遇到,但在VSTO開發群體中,這裡的確是個大坑,希望給大家填補此坑後,大家可以更順暢地寫出更好的程式碼。

技術交流QQ群

QQ群名:Excel催化劑開源討論群, QQ群號:788145319

 

  Excel催化劑開源討論群二維碼

關於Excel催化劑

Excel催化劑先是一微信公眾號的名稱,後來順其名稱,正式推出了Excel外掛,外掛將持續性地更新,更新的週期視本人的時間而定爭取一週能夠上線一個大功能模組。Excel催化劑外掛承諾個人使用者永久性免費使用!

Excel催化劑外掛使用最新的佈署技術,實現一次安裝,日後所有更新自動更新完成,無需重複關注更新動態,手動下載安裝包重新安裝,只需一次安裝即可隨時保持最新版本!

Excel催化劑外掛下載連結:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q

  聯絡作者   公眾號

取名催化劑,因Excel本身的強大,並非所有人能夠立馬享受到,大部分人還是在被Excel軟體所虐的階段,就是頭腦裡很清晰想達到的效果,而且高手們也已經實現出來,就是自己怎麼弄都弄不出來,或者更糟的是還不知道Excel能夠做什麼而停留在不斷地重複、機械、手工地在做著資料,耗費著無數的青春年華歲月。所以催生了是否可以作為一種媒介,讓廣大的Excel使用者們可以瞬間點燃Excel的爆點,無需苦苦地掙扎地沒日沒夜的技巧學習、高階複雜函式的燒腦,最終走向了從入門到放棄的道路。

最後Excel功能強大,其實還需樹立一個觀點,不是所有事情都要交給Excel去完成,也不是所有事情Excel都是十分勝任的,外面的世界仍然是一個廣闊的世界,Excel只是其中一枚耀眼的明星,還有其他更多同樣精彩強大的技術、工具等。*Excel催化劑也將借力這些其他技術,讓Excel能夠發揮更強大的爆發!

關於Excel催化劑作者

姓名:李偉堅,從事資料分析工作多年(BI方向),一名同樣在路上的學習者。
服務過行業:零售特別是鞋服類的零售行業,電商(淘寶、天貓、京東、唯品會)

技術路線從一名普通使用者,通過Excel軟體的學習,從此走向資料世界,非科班IT專業人士。
歷經重重難關,終於在資料的道路上達到技術平原期,學習眾多的知識不再太吃力,同時也形成了自己的一套資料解決方案(資料採集、資料加工清洗、資料多維建模、資料報表展示等)。

擅長技術領域:Excel等Office家族軟體、VBA&VSTO的二次開發、Sqlserver資料庫技術、Sqlserver的商業智慧BI技術、Powerbi技術、雲伺服器佈署技術等等。

2018年開始職業生涯作了重大調整,從原來的正職工作,轉為自由職業者,暫無固定收入,暫對前面道路不太明朗,苦重新回到正職工作,對Excel催化劑的運營和開發必定受到很大的影響(正職工作時間內不可能維護也不可能隨便把工作時間內的成果公佈於外,工作外的時間也十分有限,因已而立之年,家庭責任重大)。

和廣大擁護者一同期盼:Excel催化劑一直能執行下去,我所惠及的群體們能夠給予支援(多留言鼓勵下、轉發下朋友圈推薦、小額打賞下和最重點的可以和所在公司及同行推薦推薦,讓我的技術可以在貴司發揮價值,實現雙贏(初步設想可以資料顧問的方式或一些小型專案開發的方式合作)。

技術交流QQ群

QQ群名:Excel催化劑開源討論群, QQ群號:788145319

 

  Excel催化劑開源討論群二維碼

關於Excel催化劑

Excel催化劑先是一微信公眾號的名稱,後來順其名稱,正式推出了Excel外掛,外掛將持續性地更新,更新的週期視本人的時間而定爭取一週能夠上線一個大功能模組。Excel催化劑外掛承諾個人使用者永久性免費使用!

Excel催化劑外掛使用最新的佈署技術,實現一次安裝,日後所有更新自動更新完成,無需重複關注更新動態,手動下載安裝包重新安裝,只需一次安裝即可隨時保持最新版本!

Excel催化劑外掛下載連結:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q

  聯絡作者   公眾號

取名催化劑,因Excel本身的強大,並非所有人能夠立馬享受到,大部分人還是在被Excel軟體所虐的階段,就是頭腦裡很清晰想達到的效果,而且高手們也已經實現出來,就是自己怎麼弄都弄不出來,或者更糟的是還不知道Excel能夠做什麼而停留在不斷地重複、機械、手工地在做著資料,耗費著無數的青春年華歲月。所以催生了是否可以作為一種媒介,讓廣大的Excel使用者們可以瞬間點燃Excel的爆點,無需苦苦地掙扎地沒日沒夜的技巧學習、高階複雜函式的燒腦,最終走向了從入門到放棄的道路。

最後Excel功能強大,其實還需樹立一個觀點,不是所有事情都要交給Excel去完成,也不是所有事情Excel都是十分勝任的,外面的世界仍然是一個廣闊的世界,Excel只是其中一枚耀眼的明星,還有其他更多同樣精彩強大的技術、工具等。*Excel催化劑也將借力這些其他技術,讓Excel能夠發揮更強大的爆發!

關於Excel催化劑作者

姓名:李偉堅,從事資料分析工作多年(BI方向),一名同樣在路上的學習者。
服務過行業:零售特別是鞋服類的零售行業,電商(淘寶、天貓、京東、唯品會)

技術路線從一名普通使用者,通過Excel軟體的學習,從此走向資料世界,非科班IT專業人士。
歷經重重難關,終於在資料的道路上達到技術平原期,學習眾多的知識不再太吃力,同時也形成了自己的一套資料解決方案(資料採集、資料加工清洗、資料多維建模、資料報表展示等)。

擅長技術領域:Excel等Office家族軟體、VBA&VSTO的二次開發、Sqlserver資料庫技術、Sqlserver的商業智慧BI技術、Powerbi技術、雲伺服器佈署技術等等。

2018年開始職業生涯作了重大調整,從原來的正職工作,轉為自由職業者,暫無固定收入,暫對前面道路不太明朗,苦重新回到正職工作,對Excel催化劑的運營和開發必定受到很大的影響(正職工作時間內不可能維護也不可能隨便把工作時間內的成果公佈於外,工作外的時間也十分有限,因已而立之年,家庭責任重大)。

和廣大擁護者一同期盼:Excel催化劑一直能執行下去,我所惠及的群體們能夠給予支援(多留言鼓勵下、轉發下朋友圈推薦、小額打賞下和最重點的可以和所在公司及同行推薦推薦,讓我的技術可以在貴司發揮價值,實現雙贏(初步設想可以資料顧問的方式或一些小型專案開發的方式合作)。