顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

2015年3月28日

C# async 和 await 控制基本教學

.net 4.5 中 async 和 await 的語法已經有很大的進步,用以下範例說明

1. 一個UI event handler 呼叫並且等待 AccessTheWebAsync 方法
2. AccessTheWebAsync 建立 HttpClient 實例 client,呼叫 client 的 GetStringAsync 方法,並立即回傳一個 Task ,其中 TResult 在這裡是一個 string 。
3. GetStringAsync 可能要等一個網站回應並且下載內容,但是因為 GetStringAsync 立即回傳一個 Task 並且把控制權交還給 GetStringAsync 的呼叫者,就是 AccessTheWebAsync 。
4. AccessTheWebAsync 繼續同步執行 DoIndependentWork 。
5. DoIndependentWork 執行完後控制權交還給 AccessTheWebAsync。
6. AccessTheWebAsync 想要接著做下面的工作,必須取得 GetStringAsync 的 Task 的結果,所以這裡使用 await 來等待結果,這樣執行權會交還給 AccessTheWebAsync 的呼叫者,就是一開始的 UI event handler,這個時候會把 AccessTheWebAsync 的狀態儲存起來以便之後使用。(這裡我的理解是,只要在一個 code block 碰到 await 就會等待,即使有不需要結果也能執行的程序,也不會先執行,都會等)
7. 當 GetStringAsync 完成了工作, await 會從 getStringTask 裡面取得 Task 的結果,並傳給 urlContents 。
8. 回傳結果,並讓處於等待狀態的 UI event handler 繼續執行。

理解要點:

1. await 不會阻止該 async 的 thread 的執行,await 是把剩下的程式變成後續程式(continuation)並且把控制權交給 async 的 caller 。
2. async 和 await 不會產生新的 thread ,async 方法不需要 multithreading ,因為 async 方法不是跑在他自創的 thread ,而是跑在當前同步的情境中( context ),只有在一個方法是執行狀態的時候才會花 CPU 時間。
3. 這種實作方法相對於 BackgroundWorker 的好處是語法簡單而且不用擔心 race condition。



Good video
http://channel9.msdn.com/Events/TechEd/NorthAmerica/2013/DEV-B319#fbid=

小重點:
async 可以搭配 void, Task, Task 來使用,如果方法沒有回傳值應該使用 async Task 而不是 async void ,async void 一般使用在最頂層的 event handler ,async void 相當於射後不理,讓其他的 UI 介面可以繼續回應使用者,其他情況應該避免使用 async void ,以免造成結果沒有產生就回傳了,或是 race condition等情況。
使用 async void 的時候,例外狀況要在呼叫的方法的內部處理,因為外部立即返回所以會離開外部try...catch的範圍。
另外 async 方法應該一路使用到底,比較好除錯。





2014年10月25日

Office Outlook Customization 開發筆記(2)

我是從 Windows 7 32bit Outlook 2010 .Net Framework 4.5 開始開發,使用 Visual Studio 2013。

接下來要選擇使用 VBA 或 VSTO ,兩個比較可以參考這裡,因為我會用到 .Net Framework 的一些程式庫,所以決定用 VSTO  來開發,語言使用 C#。

然後最好先去下載 Outlook 2010 範例來閱讀和修改,沒看過範例很難起手。

開發上要注意的是,Application, Explorer, Inspector 等的 instance 是可以有多個並存的,因為使用者可以開多個 Outlook、多個郵件視窗,所以各個 instance 要蒐集起來處理,可以自製類別和類別容器來把這些 instance 包起來。

特別要講的是 UI  的開發,我選 Custom Ribbon UI 來開發,比較簡單的方法是先用 Ribbon UI Designer 拉出大概想要的介面,再匯出成 XML 的格式來修改,兩種設計方式無法並存,最後決定用 Ribbon XML ,因為屬性要修改比較方便,缺點是要查 msdn 才知道屬性名稱。

載入客製化 UI 的方法是定義 GetCustomUI(string ribbonID) ,依照目前的情境(Explorer, Mail.Read, Mail.Compose, ....)來決定目前要載入哪個搭配的 Custom UI 的 XML 或 Designer UI 檔案。

互動原理是在 Ribbon XML 中指定 Callback 函式名稱,然後在程式中定義 Callback 函式的處理方式,參考這裡

預設的 Ribbon UI template 會有完整的 customUI > ribbon > tabs > tab> group 的結構,可以讓一個外掛擁有很大的空間,也會自動做 responsive layout ,但是如果我們只是想要改造某個內建的功能,我們可以指定 ControlId / OfficeId 或是 XML 的 idMso 來指定修改某個內建的部份(參考這裡),至於內建 ID 的列表可以從這裡下載。

Ribbon UI 的優點是他是自適應的,在 Ribbon UI XML 中,如果要幫按鈕加上自定的 icon ,可以使用 getImage 方法,然後在 C# 檔案中回傳 BitMap ,路徑範例 MyAddin1.Properties.Resources.myIcon ,不加附檔名。圖片檔可以從 Project 的 Properties 加入。



Office Outlook Customization 開發筆記(3) Signing & Publishing

2014年10月24日

Office Outlook Customization 開發筆記(1)

嘗試 Outlook 的開發,這次要做一個 Outlook 小工具,記錄一下開發過程。

首先要了解環境,建議最好對於客戶或使用者電腦的環境有一定的認知再開始比較好。

可能的變異數是:

1. 作業系統:不同的作業系統很有可能要跑不同的 build ,也要注意哪些系統微軟已經停止支援,還有雖然 Mac OS 也有 Office ,但是並沒有開發工具可以讓開發者客製化,最接近的情況就是用 AppleScript 做一些自動化的工作,但是可開發功能低很多,也不能改變使用者介面。

2. CPU位元:我只有一台 32bit 老電腦,無法開發 64bit CPU 的產品,反之 64bit 可以開發 64bit & 32bit 的。

3. .Net Framework 版本:基本上個版本無法向下相容之前的版本,除了 .Net Framework 3.5 包含 3.0 和 2.5 ,還有 4.5 和 4.0 可以相容。 如果知道客戶用的版本可以針對該版本開發,或是安裝的時候幫他裝相應的版本,但此時也要考慮到,比較新的版本的 .Net Framework 是無法安裝在比較舊的作業系統上的。

4. Outlook:2013, 2010, 2007, 2003 不同版本我是分不同專案分開開發的,沒有看到好方法可以放在同一個專案開發。

5. 連線環境:跟部屬方式有關,要看客戶的使用環境是否可以連上網路,來選擇不同的方式打包讓客戶安裝。

由此可知,可能的排列組合太多了,非常痛苦,所以最好要對目標用戶的使用環境先了解一下,有些客戶不會看環境,可以丟個 whatsmyos.com 請客戶看一下,.Net Framework就要自己想辦法包了。

開發微軟的產品會需要很多 license ,自己全買下來會很貴,可以看看 express 版本,校友版本,或是申請 Microsoft BizSpark。