2011-12-27 53 views
2

我使用HttpWebRequest類異步,如下圖所示(它的一個Windows應用程序)的HttpRequest給參數AsyncCallback委託

private void StartWebRequest(string url) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.BeginGetResponse(new AsyncCallback(FinishWebRequest), request); 
} 

private void FinishWebRequest(IAsyncResult result) 
{ 
    HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse; 
    Stream responseStream = response.GetResponseStream(); 
    int num = 100000; 
    byte[] buffer = new byte[num]; 
    int offset = 0; 

    while ((num2 = responseStream.Read(buffer, offset, 1000)) != 0) 
    { 
     offset += num2; 
    } 

    MemoryStream stream = new MemoryStream(buffer, 0, offset); 
    Bitmap bitmap = (Bitmap)Image.FromStream(stream); 
    bitmap.Save(@"z:\new.jpg"); 
    response.Close(); 
    responseStream.Close(); 
    stream.Close(); 
} 

但我想從StartWebRequest方法給予一定的參數給AsyncCallback代表,它是可能?因爲我想拍攝照片的名稱作爲參數,如:

bitmap.Save(@"z:\MYPARAMATERVALUE.jpg"); 

回答

6

這裏最簡單的方法是使用一個匿名函數(匿名方法或lambda表達式),像這樣:

private void StartWebRequest(string url, string filename) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.BeginGetResponse(result => { 
     FinishWebRequest(result, request, filename); 
    }, null); // Don't need the state here any more 
} 

private void FinishWebRequest(IAsyncResult result, 
           HttpWebRequest request, 
           string filename) 
{ 
    using (HttpWebResponse response = 
      (HttpWebResponse) request.EndGetResponse(result)) 
    { 
     // Use filename here 
    } 
} 

你可以做當然,所有這些都是手動的,但是您需要創建一個新類來捕獲文件名,創建該類的一個實例,然後在該類中爲回調委派使用一個方法。這正是編譯器爲匿名函數所做的。