0

タイトルが明確または正しくない場合は申し訳ありませんが、どのタイトルを付ける必要があるかわかりません。間違っている場合は修正してください。
IPカメラから画像をダウンロードするためのこのコードがあり、画像をダウンロードできます。
問題は、2台以上のカメラがある場合、すべてのカメラで同時に画像のダウンロードプロセスを実行するにはどうすればよいですか?

private void GetImage()
{
   string IP1 = "example.IPcam1.com:81/snapshot.cgi;
   string IP2 = "example.IPcam2.com:81/snapshot.cgi;
   .
   .
   .
   string IPn = "example.IPcamn.com:81/snapshot.cgi";

   for (int i = 0; i < 10; i++)
   {
       string ImagePath = Server.MapPath("~\\Videos\\liveRecording2\\") + string.Format("{0}", i, i + 1) + ".jpeg";
       string sourceURL = ip;
       WebRequest req = (WebRequest)WebRequest.Create(sourceURL);
       req.Credentials = new NetworkCredential("user", "password");
       WebResponse resp = req.GetResponse();
       Stream stream = resp.GetResponseStream();
       Bitmap bmp = (Bitmap)Bitmap.FromStream(stream);
       bmp.Save(ImagePath);
   }
}
4

2 に答える 2

3

ASP.NETアプリケーションからそのような長時間実行されるコードを実行しないでください。それらは単に要求に応答することを目的としています。

このコードをサービスに配置し(Windowsサービスは簡単です)、その中で実行されているWCFサービスを介してサービスを制御する必要があります。

usingまた、WebResponseとStreamがブロックになっていないため、問題が発生します。

于 2012-10-17T02:30:00.223 に答える
0

ユーザーにフィードバックを報告する方法に応じて、いくつかの方法があります。それはすべてマルチスレッドに帰着します。

を使用した一例を次に示しThreadPoolます。これには全体を通して一連のエラーチェックが欠けていることに注意してください...これはThreadPool、堅牢なアプリケーションとしてではなく、 の使用方法の例としてここにあります。

private Dictionary<String, String> _cameras = new Dictionary<String, String> {
    { "http://example.IPcam1.com:81/snapshot.cgi", "/some/path/for/image1.jpg" },
    { "http://example.IPcam2.com:81/snapshot.cgi", "/some/other/path/image2.jpg" },
};

public void DoImageDownload() {
    int finished = 0;

    foreach (KeyValuePair<String, String> pair in _cameras) {
        ThreadPool.QueueUserWorkItem(delegate {
            BeginDownload(pair.Key, pair.Value);
            finished++;
        });
    }

    while (finished < _cameras.Count) {
        Thread.Sleep(1000);  // sleep 1 second
    }
}

private void BeginDownload(String src, String dest) {
    WebRequest req = (WebRequest) WebRequest.Create(src);
    req.Credentials = new NetworkCredential("username", "password");
    WebResponse resp = req.GetResponse();
    Stream input = resp.GetResponseStream();
    using (Stream output = File.Create(dest)) {
        input.CopyTo(output);
    }
}

この例では、for ループで行っている作業を単純に取得し、処理のためにスレッド プールにオフロードします。実際のDoImageDownload作業はあまり行わないため、メソッドは非常に迅速に戻ります。

ユース ケースによっては、 の呼び出し元からのイメージのダウンロードが完了するまで待機するメカニズムが必要になる場合がありますDoImageDownload。一般的なアプローチは、 の最後にイベント コールバックを使用してBeginDownload、ダウンロードの完了を通知することです。画像が終了するまで待機する単純なwhileループをここに配置しました...もちろん、画像が見つからないか、delegate返されない場合に備えて、これにはエラーチェックが必要です。

全体にエラーチェックを追加してください...これが出発点になることを願っています。

于 2012-10-17T02:25:15.620 に答える