C # Как передать больше, чем просто IAsyncResult в AsyncCallback? - PullRequest
5 голосов
/ 11 апреля 2011

Как передать в 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).

1 Ответ

12 голосов
/ 11 апреля 2011

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

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

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