検索
ホームページバックエンド開発C#.Net チュートリアルC# の WebClient によって実装されたファイル ダウンロード コードの詳細なグラフィックとテキストの説明

この記事では、C# での WebClient によるファイルのダウンロードの実装を中心に紹介します。編集者が非常に優れていると考えたので、参考として共有します。エディターをフォローして見てみましょう

さまざまな複雑なネットワーク環境を考慮して、作成者は、プログラムの使いやすさを高めるために、ダウンロードの試みに異なるプログラミング インターフェイスを使用することにしました。

ここではWebClientを使用する方法のみを紹介し、以降の記事で他の方法を紹介します。このブログ記事では主にアイデアとキーコードを紹介しており、完全なデモは記事の最後に添付されています。

プロキシを使用してインターネットにアクセスします

多くの会社員は、会社が設定したプロキシを介してインターネットにアクセスします。プロキシを介してインターネットにアクセスするのは、主に企業がさまざまな制御を実行しやすくするためです。もちろん、いくつかの特別な機能を実装することもできます...ただし、これにより、プログラムがネットワークにアクセスする際にいくつかの問題が発生します。

実際、WebClient の API はすでに非常に高性能です。たとえば、作成した HttpWebRequest オブジェクトには Proxy 属性があります。つまり、WebHttpRequest はデフォルトで、見つかったプロキシを使用します。これは素晴らしいもので、多くの状況に対処できます。ただし、このデフォルト プロキシがドメイン ユーザーの ID 情報を検証する必要がある場合、WebHttpRequest を使用してネットワークにアクセスすると失敗する可能性があります。この時点で、Proxy Credentials プロパティを確認すると、null であることがわかります。

システムのデフォルトの認証情報は WebClient API から取得できますが、Proxy.Credentials プロパティがデフォルトでこの値に設定されない理由は不明です。自分たちで設定するだけです。

request.Proxy.Credentials = CredentialCache.DefaultCredentials;

しかし、実際のネットワーク環境はより複雑である可能性があり、ユーザーはネットワーク用のプロキシとネットワークに必要な資格情報を指定する必要があります。文章は次のとおりです:

myProxy = new WebProxy("proxyAddress"); 
myProxy.Credentials = new NetworkCredential(ProxyUserName, ProxyUserPasswd, DomainName);

キャッシュを克服しよう

キャッシュはどこにでもあり、サーバー側の CDN にもキャッシュが存在し、クライアントのプロキシ層にもキャッシュが存在します。一般的な問題は、サーバー上のファイルが更新されたにもかかわらず、一部の顧客が依然として古いファイルをダウンロードするということです。まずクライアントのキャッシュの問題に対処しましょう。

HttpWebRequest の CachePolicy.Level プロパティはキャッシュ ポリシーの設定に使用されますが、そのデフォルト値は BypassCache です。これを Reload に変更するだけです:


コードをコピーします コードは次のとおりです:


request.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.Reload);

次のステップは、サーバー側のキャッシュの問題です。

今では誰もが CDN を使用しているようですが、使用中に CDN 側のキャッシュ更新に関する問題が頻繁に見つかります。オンラインで検索しましたが、良い解決策は見つかりませんでしたが、リクエストにパラメータとしてランダムな文字列を追加するという良い回避策がありました。

Random rdm = new Random();
string s = rdm.Next().ToString();
myUrl += "?" + s;

キャッシュに関しては、現在のユースケースに適合する戦略を使用する必要があり、画一的なものではないことに注意してください。

よりフレンドリーなダウンロードプロセス

スクロールバーを使用して、ダウンロードの進行状況を表示し、リアルタイムのダウンロード速度を表示し、ユーザーがダウンロードをキャンセルできるようにします:

以下は、ダウンロードのためのコアコードです。ダウンロードの割合と現在のダウンロード速度の計算を別々に紹介します。

// 获得下载文件的长度
double contentLength = DownloadManager.GetContentLength(myHttpWebClient);
byte[] buffer = new byte[BufferSize];
long downloadedLength = 0;
long currentTimeSpanDataLength = 0;   
int currentDataLength;
while ((currentDataLength = stream.Read(buffer, 0, BufferSize)) > 0 && !this._cancelDownload)
{
 fileStream.Write(buffer, 0, currentDataLength);
 downloadedLength += (long)currentDataLength;
 currentTimeSpanDataLength += (long)currentDataLength;
 int intDownloadSpeed = 0;
 if (this._downloadStopWatch.ElapsedMilliseconds > 800)
 {
  double num5 = (double)currentTimeSpanDataLength / 1024.0;
  double num6 = (double)this._downloadStopWatch.ElapsedMilliseconds / 1000.0;
  double doubleDownloadSpeed = num5 / num6;
  intDownloadSpeed = (int)Math.Round(doubleDownloadSpeed, 0);
  this._downloadStopWatch.Reset();
  this._downloadStopWatch.Start();
  currentTimeSpanDataLength = 0;
 }

 double doubleDownloadPersent = 0.0;
 if (contentLength > 0.0)
 {
  doubleDownloadPersent = (double)downloadedLength / contentLength;
 }
}

ダウンロードプロセス中のダウンロードパーセンテージを計算します

まず、httpリクエストからダウンロードするファイルの長さを取得する必要があります。詳細については、これに添付されているデモを参照してください。記事。

double contentLength = DownloadManager.GetContentLength(myHttpWebClient);

ファイル ストリームからデータが読み取られるたびに、読み取られたバイト数 (currentDataLength) がわかり、その累計が現在ダウンロードされているファイルの長さになります。

downloadedLength += (long)currentDataLength;

それから、除算をするだけです:

doubleDownloadPersent = (double)downloadedLength / contentLength;

リアルタイムのダウンロード速度を計算します

現在のダウンロード速度については、過去の期間にダウンロードされたバイト数を計算します番号。この期間は、StopWatch を使用して取得できます。私が選択した期間には 800 ミリ秒を超える時間が必要です。

if (this._downloadStopWatch.ElapsedMilliseconds > 800)
{
 /***********************************/
 // 计算上一个时间段内的下载速度
 double num5 = (double)currentTimeSpanDataLength / 1024.0;
 double num6 = (double)this._downloadStopWatch.ElapsedMilliseconds / 1000.0;
 double doubleDownloadSpeed = num5 / num6;
 /***********************************/

 intDownloadSpeed = (int)Math.Round(doubleDownloadSpeed, 0);
 // 本次网速计算完成后重置时间计时器和数据计数器,开始下次的计算
 this._downloadStopWatch.Reset();
 this._downloadStopWatch.Start();
 currentTimeSpanDataLength = 0;
}

実際、ダウンロード速度の各計算の期間の長さは固定されていませんが、これは計算結果に影響を与えません。最後の値から 800 ミリ秒以上であることを確認するだけで済みます。計算。

ユーザーにダウンロードのキャンセルを許可する

実行に時間がかかるタスクの場合、ユーザーにキャンセルを許可しないことは非常に嫌われます。特にインターネットの速度があまり良くない場合。したがって、ユーザーに選択肢を与える必要があります。つまり、現在の旅を(苦痛を伴うのではなく)幸せに終えることができるのです。

そしてそれは私たちにとってとても簡単です!

コードは次のとおりです:

while ((currentDataLength = stream.Read(buffer, 0, BufferSize)) > 0 && !this._cancelDownload){}

データ ストリームからデータを読み取るときに、ユーザーが「キャンセル」ボタン (ここでは this._cancelDownload 変数) を押したかどうかを確認します。 true の場合は、現在のダウンロードを終了します。

これで、ユーザーからの最も一般的な苦情が解決されました。実際、追加されたコードはそれほど多くなく、すべての知識ポイントは非常に微妙に見えます。しかし、明らかにユーザーエクスペリエンスが向上します。これは、主要な機能を完了することは作業の一部にすぎない場合もあり、常に経験と発見を必要とする場合があります...

デモのダウンロード アドレス: WebClientDemo_jb51.rar

。上記は、C# での WebClient 実装ファイルのダウンロード コードの詳細なグラフィックとテキストの説明です。さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
.NETエコシステム:C#の役割以降.NETエコシステム:C#の役割以降May 03, 2025 am 12:04 AM

C#は、.NETエコシステムで中核的な役割を果たし、開発者にとって好ましい言語です。 1)C#は、C、C、Javaの利点を組み合わせた効率的で使いやすいプログラミング方法を提供します。 2).NETランタイム(CLR)を介して実行して、効率的なクロスプラットフォーム操作を確保します。 3)C#は、LINQや非同期プログラミングなどの基本的な使用から高度な使用をサポートします。 4)最適化とベストプラクティスには、StringBuilderおよび非同期プログラミングを使用して、パフォーマンスと保守性を向上させることが含まれます。

.NET言語としてのC#:エコシステムの基礎.NET言語としてのC#:エコシステムの基礎May 02, 2025 am 12:01 AM

C#は、2000年にMicrosoftがリリースしたプログラミング言語で、CのパワーとJavaのシンプルさを組み合わせることを目指しています。 1.C#は、カプセル化、継承、多型をサポートするタイプセーフ、オブジェクト指向のプログラミング言語です。 2. C#のコンパイルプロセスは、コードを中間言語(IL)に変換し、.NETランタイム環境(CLR)でマシンコード実行にコンパイルします。 3. C#の基本的な使用法には、可変宣言、制御フロー、関数の定義が含まれ、高度な使用法には非同期プログラミング、LINQ、およびデリゲートなどが含まれます。4。一般的なエラーには、デバッガー、例外処理、ロギングを介してデバッグできるタイプミスマッチおよびヌル参照の例外が含まれます。 5.パフォーマンスの最適化の提案には、LINQの使用、非同期プログラミング、およびコードの読み取り可能性の向上が含まれます。

C#対.NET:重要な違​​いと類似点を明確にしますC#対.NET:重要な違​​いと類似点を明確にしますMay 01, 2025 am 12:12 AM

C#はプログラミング言語であり、.NETはソフトウェアフレームワークです。 1.C#はMicrosoftによって開発されており、マルチプラットフォーム開発に適しています。 2..NETは、クラスライブラリとランタイム環境を提供し、多言語をサポートします。 2つは協力して最新のアプリケーションを構築します。

誇大広告を超えて:c#.netの現在の役割を評価する誇大広告を超えて:c#.netの現在の役割を評価するApr 30, 2025 am 12:06 AM

C#.NETは、C#言語と.NETフレームワークの利点を組み合わせた強力な開発プラットフォームです。 1)エンタープライズアプリケーション、Web開発、ゲーム開発、モバイルアプリケーション開発で広く使用されています。 2)C#コードは中間言語にコンパイルされ、.NETランタイム環境によって実行され、ガベージコレクション、タイプの安全性、LINQクエリをサポートします。 3)使用の例には、基本的なコンソール出力と高度なLINQクエリが含まれます。 4)空の参照やタイプ変換エラーなどの一般的なエラーは、デバッガーとロギングを通じて解決できます。 5)パフォーマンスの最適化の提案には、非同期プログラミングとLINQクエリの最適化が含まれます。 6)競争にもかかわらず、C#.NETは継続的なイノベーションを通じて重要な地位を維持しています。

C#.NETの未来:トレンドと機会C#.NETの未来:トレンドと機会Apr 29, 2025 am 12:02 AM

C#.NETの将来の傾向は、主にクラウドコンピューティング、マイクロサービス、AIおよび機械学習統合、およびクロスプラットフォーム開発の3つの側面に焦点を当てています。 1)クラウドコンピューティングとマイクロサービス:C#.NETは、Azureプラットフォームを介してクラウド環境のパフォーマンスを最適化し、効率的なマイクロサービスアーキテクチャの構築をサポートします。 2)AIと機械学習の統合:ML.NETライブラリの助けを借りて、C#開発者はアプリケーションに機械学習モデルを埋め込み、インテリジェントアプリケーションの開発を促進できます。 3)クロスプラットフォーム開発:.NetCoreおよび.Net5を介して、C#アプリケーションはWindows、Linux、およびMacOで実行され、展開範囲が拡大します。

C#.NET開発今日:トレンドとベストプラクティスC#.NET開発今日:トレンドとベストプラクティスApr 28, 2025 am 12:25 AM

C#.NET開発における最新の開発とベストプラクティスには、次のものが含まれます。1。非同期プログラミングは、アプリケーションの応答性を向上させ、Asyncを使用して非ブロッキングコードを簡素化し、キーワードを待ちます。 2。LINQは強力なクエリ関数を提供し、遅延した実行および式ツリーを介してデータを効率的に操作します。 3.パフォーマンスの最適化の提案には、非同期プログラミングの使用、LINQクエリの最適化、メモリの合理的な管理、コードの読みやすさとメンテナンスの改善、単体テストの書き込みが含まれます。

C#.NET:.NETエコシステムを使用したアプリケーションの構築C#.NET:.NETエコシステムを使用したアプリケーションの構築Apr 27, 2025 am 12:12 AM

.NETを使用してアプリケーションを構築する方法は? .NETを使用してアプリケーションを構築することは、次の手順を通じて達成できます。1)C#言語やクロスプラットフォーム開発サポートを含む.NETの基本を理解します。 2)コンポーネントや.NETエコシステムの作業原則などのコア概念を学習します。 3)単純なコンソールアプリケーションから複雑なWebAPISおよびデータベース操作まで、基本的および高度な使用をマスターします。 4)構成やデータベース接続の問題など、一般的なエラーとデバッグ手法に精通している。 5)アプリケーションのパフォーマンスの最適化と非同期プログラミングやキャッシュなどのベストプラクティス。

汎用性のある.NET言語としてのC#:アプリケーションと例汎用性のある.NET言語としてのC#:アプリケーションと例Apr 26, 2025 am 12:26 AM

C#は、エンタープライズレベルのアプリケーション、ゲーム開発、モバイルアプリケーション、Web開発で広く使用されています。 1)エンタープライズレベルのアプリケーションでは、C#がasp.netcoreにWebAPIを開発するためによく使用されます。 2)ゲーム開発では、C#がUnityエンジンと組み合わされて、ロールコントロールやその他の機能を実現します。 3)C#は、コードの柔軟性とアプリケーションのパフォーマンスを改善するために、多型と非同期プログラミングをサポートします。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境