FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

.NET 2.0 で、非同期HTTP通信する方法

うーむ。
.NET を使うと、実に簡単に非同期HTTP通信ができてしまう。
.NET 2.0 から導入された System.Net.WebClient オブジェクトを使えば良い。

参考サイト。m(_ _)m
http://www.vbstation.net/tips/downloadfileasync.htm

こちらのサイトのサンプルコードを、ほぼそのままC#に移植させていただいたのがこれ。

using System;
using System.IO;
using System.Net;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace DownLoader
{
  public partial class Downloader : Form
  {
    private System.Net.WebClient m_webClient = new System.Net.WebClient();

    public Downloader()
    {
      InitializeComponent();
    }

    private void Downloader_Load(object sender, EventArgs e)
    {
      edtDownloadUrl.Text = "http://www.yahoo.co.jp";
      edtSavePath.Text = "C:\\tmp.html";
      lblStatus.Text = "";
      progress.Value = 0;
      btnStop.Enabled = false;

      this.m_webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(this.webClient_DownloadFileCompleted);
      this.m_webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(this.webClient_DownloadProgressChanged);
    }

    //「ダウンロード開始」ボタンクリック
    private void btnStart_Click(object sender, EventArgs e)
    {
      //入力項目チェック
      if (edtDownloadUrl.Text.Length == 0) {
        MessageBox.Show("ダウンロードURLを入力してください。", "エラー",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        edtDownloadUrl.Focus();
        return;
      }
      if (edtSavePath.Text.Length == 0) {
        MessageBox.Show("保存先を入力してください。", "エラー",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        edtSavePath.Focus();
        return;
      }
      //ファイル有無チェック
      if (File.Exists(edtSavePath.Text)) {
        if (MessageBox.Show(
            "ファイルが既に存在します。上書きしますか?", "確認",
            MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel) {
          return;
        }
      }
      //ダウンロード開始
      Uri uni = new Uri(edtDownloadUrl.Text);
      try {
        m_webClient.DownloadFileAsync(uni, edtSavePath.Text);
        edtDownloadUrl.ReadOnly = true;
        edtSavePath.ReadOnly = true;
        btnStart.Enabled = false;
        btnStop.Enabled = true;
      } catch (Exception ex) {
        MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
    }


    //「ダウンロード中止」ボタンクリック
    private void btnStop_Click(object sender, EventArgs e)
    {
      m_webClient.CancelAsync();
    }

    //ダウンロード完了イベント
    private void webClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
     if (e.Cancelled) {
        lblStatus.Text = "ダウンロードは中止されました";
     } else if (e.Error == null) {
        lblStatus.Text = "ダウンロードが完了しました";
     } else {
        lblStatus.Text = e.Error.Message;
     }
     progress.Value = 0;
     edtDownloadUrl.ReadOnly = false;
     edtSavePath.ReadOnly = false;
     btnStart.Enabled = true;
     btnStop.Enabled = false;
    }

    //ダウンロード進捗状況変更イベント
    private void webClient_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
    {
      progress.Value = e.ProgressPercentage;
      lblStatus.Text = e.BytesReceived.ToString() + " / " + e.TotalBytesToReceive.ToString();
    }
  }
}

イベントハンドラの書き方が VB と C# ではかなり違うんだなあ、ということが分かった。
スポンサーサイト
コメント
コメントの投稿
管理者にだけ表示を許可する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。