撰文於銘 飄散隨風 心行無語 仰首蒼穹

C# 使用 HttpClient 非同步下載檔案

因為所寫的 C# 程式需要由網路下載大的檔案,但官方文件所寫的內容不夠多,所以花了點時間,研究了 HttpClient 非同步下載,並且記錄了一些資料,以供自己未來複習及提供有需要的人參考。

 

WebClient vs HttpClient

 

在微軟官方文件中,一開始有找到了 WebClient 和 HttpClient 二種類別,結果在 WebClient 的官方文件中,看到這一段:

 

 

我們不建議您將類別用於 WebClient 新的開發。 請改用 System.Net.Http.HttpClient 類別。
 

 

所以就放棄研究 WebClient,直攻 HttpClient 了。

 

HttpClient 及注意事項

 

HttpClient 雖然比 WebClient 好用,但有一些事要注意。

 

首先是不要大量使用新建立的 HttpClient,底下是官方文件的說明:

 

 

HttpClient 的目的是要具現化一次,並在應用程式的整個生命週期中重複使用。具現化每個要求的 HttpClient 類別,將會耗盡繁重負載下可用的通訊端數目。這會導致 >socketexception 錯誤。以下是正確使用 HttpClient 的範例。
 

 

 

public class GoodController : ApiController

{

    private static readonly HttpClient HttpClient;

 

    static GoodController()

    {

        HttpClient = new HttpClient();

    }

}

 

不過,在實測中,最多同時只能開啟二個連結。

 

查了不少資料,才知道有個變數 ServicePointManager.DefaultConnectionLimit,官方說明

 

 

ServicePoint 物件所允許的同時連線最大數。 ASP.NET 裝載的應用程式預設的連線限制為10,其他則為2。

 

 

所以若要多開啟幾個連結,不知如何做才好?目前我只找到二個方法:

 

1. 增加 ServicePointManager.DefaultConnectionLimit

2. HttpClient 每次都建立新物件,就沒這個問題了。

 

 

在網路上也查詢了其它文章,有人提到若用 static 的方式來執行 HttpClient ,也會有一些限制,例如長期連線時,可能因為網路上的 DNS 更新後,HttpClient 沒有更新解析 DNS,就會有問題。

 

因此有人介紹更好用的 HttpClientFactory,不過官方文件我只有查到 IHttpClientFactory,而且看起來有點複雜,反正我目前的程式不會用到大量的連線,也不會需要長時間使用,不用擔心 DNS 更新的問題,所以決定還是使用 HttpClient 即可。

 

另外,官方還有這個建議:

 

 

想要下載大量資料 (50 mb 或以上的) ,則應用程式應該串流這些下載,而不使用預設的緩衝。如果使用預設緩衝,用戶端記憶體使用量將會變得非常大,可能會大幅降低效能。

 

 

這也是我需要測試的,因為我需要下載的檔案會有超過 GB 的大小。

 

重要度:
文章分類:
電腦標籤:

安裝 Drupal 9

 

安裝環境

 

XAMPP 免裝版,內含:

 

  • PHP:8.0.9
  • Web:Apache/2.4.48 (Win64) OpenSSL/1.1.1k
  • Database:10.4.20-MariaDB
 

Drupal:9.3.0

 

下載檔案

 

下載 Drupal 9 最新版,解壓縮至指定目錄,例如:

 

/htdocs/drupal9

 

底下是根據 Drupal 目錄中的 INSTALL.txt 的說明安裝的。

 

安裝 Composer

 

參考此說明

 

https://getcomposer.org/doc/00-intro.md#globally

 

我是採用 Windows 版的安裝,下載並執行 Composer-Setup.exe

 

重要度:
文章分類:
電腦標籤:

C# 使用 Skin 套件讓程式更美觀 (下)

 

DarkUI

 

DarkUI 是參考此頁

 

https://ourcodeworld.com/articles/read/517/how-to-use-a-darkui-dark-user-interface-in-winforms-c-sharp

 

首先用 git clone 這個專案

 

https://github.com/RobinPerris/DarkUI.git

 

用 Visual Studio 開啟它,並且 build 它。會在 bin/Debug 中產生新的 DarkUI.dll

 

再開新專案,將此 dll 的元件加入工具箱中,會看到一堆暗色系的元件。

 

image

 

重要度:
文章分類:

C# 使用 Skin 套件讓程式更美觀 (中)

Material Skin

 

Material Skin 有不少人推薦,安裝方法同上,先在 NuGet 套件中搜尋 material skin,底下可以看到有不少種,應該是挑比較新的版本吧?我多挑幾個來試試。

 

image

 

在測試時有好幾個是無法順利安裝的,例如:

 

image

 

再把安裝好的套件一一加入工具箱中。

 

image

 

全部一一安裝時,發現會有衝突,底下改試著逐一安裝。

 

重要度:
文章分類:

C# 使用 Skin 套件讓程式更美觀 (上)

Iris Skin

 

首先建立一個專案,放上一堆元件。

 

image

 

在專案「參考」按右鍵,選取「管理 NuGet 套件」。

 

image

 

在 NuGet 套件管理員瀏覽頁上方的搜尋框中輸入「irisskin」,會找到 HiNetCloud.IrisSkin4,選擇它並在右方選擇安裝,就會安裝到專案中。

 

重要度:
文章分類:

Google雲端硬碟更改檔名變成上傳的陷阱

最近在 Google 串流版的雲端硬碟進行更名時,發現一個奇怪的現象,寫出來給大家參考,免得日後踩到同樣的地雷 。 :)

假設我有五個檔案。

 

121-0001.jpg

121-0002.jpg

121-0003.jpg

121-0004.jpg

121-0005.jpg

 

我想把它們改名,也就是把最後一個數字減一,理論上我只要寫這個批次檔就可以了,注意順序不可以錯誤。

 

ren 121-0001.jpg 121-0000.jpg

ren 121-0002.jpg 121-0001.jpg

ren 121-0003.jpg 121-0002.jpg

ren 121-0004.jpg 121-0003.jpg

ren 121-0005.jpg 121-0004.jpg

 

不過在實際執行後,檔案的確立刻改好了,但發現雲端硬碟程式在大量工作,一查才發現它在上傳檔案。

 

image

 

重要度:
文章分類:

C# WinForm 取得傳入的參數

C# WinForm 程式要取得使用者傳入的參數,可以使用

 

Environment.GetCommandLineArgs();

 

所取得的第一個元素就是執行檔的檔案名稱。

 

 

public MainForm()

{

    InitializeComponent();

    string[] args = Environment.GetCommandLineArgs();

    foreach(string s in args) {

        MessageBox.Show(s);

    }

}

 

另一種在網路上常看到的方法,就是手動在 Main 主程式的參數中加上 string[] args。

這個方式取得的參數,並不包含執行檔的檔案名稱,這是和上面方法不同的地方,在使用上要注意。

 

[STAThread]

static void Main(string[] args)

{

    foreach(string s in args) {

        MessageBox.Show(s);

    }

    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(false);

    Application.Run(new MainForm());

}

 

 

重要度:
文章分類:
電腦標籤:

C# 單元測試

C# 單元測試

參考:

https://docs.microsoft.com/zh-tw/visualstudio/test/getting-started-with-unit-testing?view=vs-2019&tabs=mstest

 

建立測試程式

先建立測試程式

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace UnitTest {

    public class Sample {

 

        int a = 0;

        int b = 0;

 

        public Sample(int x, int y) {

            a = x;

            b = y;

        }

 

        public int Add() {

            return a + b;

        }

 

        public int Add2() {

            return a * 2 + b * 2;

        }

 

        public int AddAnother (int x) {

            return a + b + x;

        }

    }

}

 

建立測試單元

在程式視窗中按滑鼠右鍵,選擇「建立單元測試」

 

image

重要度:
文章分類:

在 Visual Studio 上使用 GitHub 進行版本控制

本文簡單示範 Visual Studio 建立 C# 專案並使用 GitHub 基本功能。

雖然 Windows 的 TortoiseGit 很好用,但如果可以直接在 Visual Studio 上直接操作,那還是比較方便。

建立專案

image

 

image

重要度:
文章分類:

論「慾境的當下即是涅槃」?

 
在瀚邦佛學研究中心看到蘇錦坤師兄貼出這篇討論
 
 
提到溫金柯依《雜阿含262經》提出「慾境的當下即是涅槃」。
 
看了一下他的理由,大概是出自這一句:
 
「一切諸行空、寂、不可得、愛盡、離欲、涅槃」
 
我想這裡應該是溫師兄對雜阿經這句有所誤解,誤以為一切諸行=空=寂=不可得=愛盡=離欲=涅槃。
 
而慾境也是諸行,所以在一連串的相等之下,有了慾境=涅槃的推論,所以提出『慾境的當下即是涅槃』。
 
然而此處的經文真的是這樣解釋的嗎?
重要度:
文章分類:

頁面

借我放一下廣告
訂閱 人生海海 RSS