安裝與設定 Service Bus for Windows 1.1

9/20/2016
摘要:Service Bus for Windows 1.1  的基本安裝與設定步驟。

用 Chrome 開啟 SSRS 報表管理員時出現權限不足的錯誤

9/18/2016
SSRS 新手筆記:第一次設定好 SQL Server Reporting Service 之後,以瀏覽器開啟報表管理員,結果出現權限不足的錯誤。

書摘:《克服團隊領導的五大障礙》

8/31/2016
摘錄《克服團隊領導的五大障礙》書中一些我覺得重要的句子...

在 leanpub.com 買書的步驟

7/22/2016
由於 leanpub.com 是英文網頁,對於習慣看中文的人來說,可能還是會有點小麻煩。所以這裡特別針對此平台說明買書流程。

《C# 本事》摘錄:LINQ (2)

7/22/2016
這是《C# 本事》LINQ 之章的第 2 篇摘錄,主要討論的議題是 LINQ 的延遲執行。

《C# 本事》摘錄:LINQ (1)

7/18/2016
改來改去,LINQ 這一章的骨架與呈現方式終於大致底定。如果我正要開始學習 LINQ,我會希望有這樣的書可以參考。我打算把其中部分內容摘錄一些上來,一方面替這個快要荒蕪的部落格加一些東西,另一方面也是為這本書打個廣告。

note of dumbing down the build server

7/18/2016

http://blog.amosti.net/dumbing-down-the-build-server/

重點不是 build server,而是你的 build system。

因此,最好別用太多 build server 軟體所提供的 fancy 功能或配置。

原則

 - 建置系統必須同時能夠在 build server 和任何開發機器上執行,並且結果要完全一樣。
 - 建置系統應該要使用易於理解的腳本語言( scripting language)來撰寫。

 - 盡量使用現有的/原生的方法(vanilla methods)。

- 建置系統應該盡量避免和特定 build server 軟體綁太緊。


文中提到了一些用來設計建置系統的工具或腳本語言:psake、FAKE、ScriptCS。

對於熟悉 C# 的人來說,ScriptCS 通常會是首選。


《Continuous Delivery 中文版》筆記

6/13/2016

《Continuous Delivery 中文版》的主題是持續交付。這裡簡單整理一點跟 deployment 有關的東西。

TeamCity 9 建置 Visual Studio 專案的一些狀況與解法

4/25/2016
整理一些 TeamCity 建置失敗的狀況和解法。

scriptcs 簡介

4/23/2016
這是 scriptcs 的入門筆記,大部分的重點都在投影片裡面。

不要寫「假的」非同步方法

1/11/2016
前文提過一個撰寫非同步程式的通用建議:從頭到尾都採用非同步呼叫。可是,有時候就是沒辦法做到這點。

Task.FromResult 用法與注意事項

1/04/2016
Task 類別有一個靜態方法可用來傳回已完成的工作,這個方法是 FromResult()。底下是一個簡單範例:

   Task<int> task1 = Task.FromResult(10);

什麼時候會用到它呢?

一個常見的應用場合是:在非同步方法中,希望以同步的方式傳回結果。舉例來說,假設你現在要設計一個支援非同步處理的快取物件,你先定義了如下介面:

interface IMyCache
{
    Task<string> GetDataAsync();
}


這表示,你預期將來實作 IMyCache 介面時,GetDataAsync 會是個非同步方法。然而,在某種特殊情況下(例如撰寫單元測試),你可能不需要複雜的非同步操作,而只需要直接傳回一個現成的結果。那麼,在撰寫 GetDataAsync 方法時,便可以用上 Task.FromResult。如下所示:

class MyCache : IMyCache
{
    public async Task<string> GetDataAsync()
    {
        return await Task.FromResult("hello"); // 此寫法有點問題,稍後說明。
    }
}


以下程式碼則示範了如何在 Console 應用程式中使用 MyCache 類別的 GetDataAsync 方法:

static void Main(string[] args)
{
    Task.Run(async () =>
    {
        IMyCache myCache = new MyCache();
        var s = await myCache.GetDataAsync();
        System.Console.WriteLine(s);
    });

    Console.ReadLine();
}


等等,上述範例的寫法其實有個問題:在沒有非同步操作的地方多餘地使用了 asyncawait 關鍵字。接著要繼續討論這個問題。

不要 await Task.FromResult 呼叫

假設你就是負責撰寫 MyCache 類別的人,那麼,你自然知道你寫的 GetDataAsync 方法其實並沒有執行任何非同步工作,因為它是呼叫 Task.FromResult 來直接(立刻)傳回一個已經完成的工作。然而,剛才的 GetDataAsync 方法卻使用了 asyncawait 關鍵字,而這兩個關鍵字會使編譯器產生一些額外的程式碼,以便用來處理非同步呼叫的等待以及環境切換等處理。既然 Task.FromResult 會直接傳回現成的 Task 物件,那麼編譯器所產生的那些額外的程式碼也就都是多餘的了。

簡單地說,我們應該遵循這個建議:不要 await 一個 Task.FromResult 呼叫。

因此,先前的 GetDataAsync 方法應該把 asyncawait 去掉,變成這樣:

public Task<string> GetDataAsync()
{
    return Task.FromResult("hello");
}


你可以看到,在定義 IMyCache 介面時,雖然預期 GetDataAsync 是個非同步方法(注意方法名稱有 Async 後綴),但實作時仍有可能採取同步的方式——當你看到這樣的寫法時,應特別留意是否無意間在非同步呼叫的流程中混雜了同步/阻斷式呼叫,例如底下這個錯誤示範:

public Task<string> GetDataAsync()
{
    string s = System.IO.File.ReadAllText(@"C:\temp\big.txt"); // 錯誤示範!
    return Task.FromResult(s);
}


參考資料

《人生是永遠的測試版》

1/02/2016
《人生是永遠的測試版》有兩位作者,其中一位 Reid Hoffman 是 LinkedIn 創辦人。推薦序和作者專訪總共 29 頁。

底下是書摘/筆記。

技術提供:Blogger.