C# Как передать в AsyncCallback больше, чем просто IAsyncResult?

Как передать в AsyncCallback больше, чем просто IAsyncResult?

Пример кода:

//Usage
var req = (HttpWebRequest)iAreq;
req.BeginGetResponse(new AsyncCallback(iEndGetResponse), req);

//Method
private void iEndGetResponse(IAsyncResult iA, bool iWantInToo) { /*...*/ }

Я хотел бы передать пример переменной bool iWantInToo. Я не знаю, как добавить это к new AsyncCallback(iEndGetResponse).


person PiZzL3    schedule 11.04.2011    source источник


Ответы (1)


Вы должны использовать состояние объекта, чтобы передать его. Прямо сейчас вы передаете параметр req, но вместо этого вы можете передать объект, содержащий и его, и логическое значение.

Например (используя Tuple .NET 4 - если вы используете .NET ‹=3.5, вы можете использовать собственный класс или KeyValuePair или аналогичный):

var req = (HttpWebRequest)iAreq;
bool iWantInToo = true;
req.BeginGetResponse(new AsyncCallback(iEndGetResponse), Tuple.Create(req, iWantInToo));

//Method
private void iEndGetResponse(IAsyncResult iA) 
{
    Tuple<HttpWebRequest, bool> state = (Tuple<HttpWebRequest, bool>)iA.AsyncState;
    bool iWantInToo = state.Item2;

    // use values..
}
person Reed Copsey    schedule 11.04.2011
comment
Очень очень интересно. Тестирую это сейчас. Я никогда раньше не видел эту сделку Tuple, выглядит очень полезно! - person PiZzL3; 11.04.2011
comment
Никто не считает этот метод некрасивым? Предполагается, что лучше передавать параметры. - person derek; 02.09.2016
comment
@derek этот шаблон в целом был заменен на асинхронную работу. самые новые API работают с задачей ‹T› - person Reed Copsey; 02.09.2016
comment
@ReedCopsey Итак, современный способ — использовать await, чтобы завершить обратный вызов, а затем выполнить работу, которую выполнял предыдущий обратный вызов? - person derek; 02.09.2016
comment
@Дерек Да. await делает обратные вызовы ненужными - person Reed Copsey; 03.09.2016