2011-12-27 4 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(); 
} 

Но я хочу дать некоторые параметры AsyncCallback делегата от StartWebRequest метода, это возможное? Потому что я хочу взять имя изображения в качестве параметра, как:

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

ответ

6

Самый простой подход здесь использовать анонимную функцию (анонимный метод или лямбда-выражение), как это:

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

Вы можете сделать все это вручную, конечно, но вам нужно создать новый класс для захвата имени файла, создать экземпляр этого класса и затем использовать метод в этом классе для делегата обратного вызова. Это именно то, что делает компилятор для вас с анонимной функцией.