2010-06-23 83 views
0

我发现下面的例子来下载网页(串)asynchounously:网上下载图像异步在.net

let getImage (imageUrl:string) = 
    async { 
     try 
      let req = WebRequest.Create(imageUrl) :?> HttpWebRequest 
      req.UserAgent <- "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"; 
      req.Method <- "GET"; 
      req.AllowAutoRedirect <- true; 
      req.MaximumAutomaticRedirections <- 4; 
      let! response1 = req.AsyncGetResponse() 
      let response = response1 :?> HttpWebResponse 
      use stream = response.GetResponseStream() 
      use streamreader = new System.IO.StreamReader(stream) 
      return! streamreader.AsyncReadToEnd() // .ReadToEnd() 
     with 
      _ -> return "" // if there's any exception, just return an empty string 

    } 

它返回一个字符串。但是,我需要以异步的方式下载在线图像(字节数组)。

任何人都可以给我一些提示?

回答

1

也许你可以用我的回答来解答另一个问题(here)。它向谷歌图表API请求图像(URL)并将字节转换为位图。

相关的代码:

async { 
    let req = HttpWebRequest.Create(..URI HERE..) 
    let! response = req.AsyncGetResponse() 
    return new Bitmap(response.GetResponseStream()) 
} |> Async.RunSynchronously 
+0

为4.5+ '异步'/ '等待' 版本检查 - http://stackoverflow.com/questions/11638821/c-sharp-net-4-5-async -多线程 – 2014-09-18 16:40:58

1

您可以直接从流中读取字节。 StreamReader在字符串上工作。它实际上继承了TextReader。另外看看使用一个BinaryReader对字节起作用。

(既然你标记它为C#我会写在C#我的代码示例)。

Stream s = response.GetResponseStream() 
MemoryStream memStream = new MemoryStream(); 
int bytesRead; 
byte[] buffer = new byte[0x1000]; 
for (bytesRead = s.Read(buffer, 0, buffer.Length); bytesRead > 0; bytesRead = s.Read(buffer, 0, buffer.Length)) 
{ 
    memStream.Write(buffer, 0, bytesRead); 
} 
s.Close(); 
return memStream.ToArray(); 
-1

可以流转换为字节数组像这样(C#)

byte[] buffer = new byte[16 * 1024]; 
using (MemoryStream ms = new MemoryStream(stream)) 
{ 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     ms.Write(buffer, 0, read); 
    } 

    var bytes = ms.ToArray(); 
}