2012-10-17 36 views
0

對不起,如果標題不清楚或不正確,不知道我應該放什麼標題。如果錯誤,請糾正。
我有這段代碼從IP攝像機下載圖像,它可以下載圖像。
問題是,如果我有兩個或更多攝像頭,我怎麼能在所有攝像頭同時進行圖像下載過程?如何在同一時間從同一代碼執行多任務處理?

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); 
    } 
} 

回答

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永遠不會返回。

一定要在整個過程中添加錯誤檢查...希望這給你一個開始的地方。

+0

我怎樣才能在同一時間的所有環節'src'? 'foreach()'應該得到所有字符串'scr',但是如果我在 'string IP1 =「http://example1.com:81/snapshot.cgi」;'和 ''提供一個源鏈接''string IP2 = 「http://example2.com:81/snapshot.cgi」;?',我怎麼能得到它'的foreach()'聲明,我怎麼能保存在單獨的文件夾中的圖片爲每個攝像頭,所以我知道哪些圖片來自該相機? – Lynx

+0

我已經更新了用於存儲IP的映射的示例答案解決路徑名,它可能不準確滿足您的需求,但希望它有助於。 – jheddings

+0

好吧,我複製和粘貼代碼,並把'DoImageDownload對於這兩款相機在不同的名稱(1.JPG&2.JPG)相同的文件夾()''要和Page_Load'改變圖像裏邊反目標文件夾。我跑的代碼,但它只能從1個攝像頭(只1個圖像下載圖像因此,我做了斷點(visual studio 2010),看看這個過程是如何進行的,但是它會下載和混淆保存目標文件夾中的2個圖像,並且圖像從不同相機正確(不重複)。我試了幾次,但結果是一樣的。 – Lynx

3

你不應該運行從ASP.NET應用程序長時間運行類似的代碼。他們只是簡單地迴應請求。

您應該將此代碼放入服務中(Windows服務很簡單),並通過其中運行的WCF服務來控制服務。

你也會陷入困境,因爲你沒有你的WebResponse和Stream在using塊。

+1

+1我錯過了'webforms'標籤......沒有想到ASP.NET。 – jheddings

相關問題