Я только что провел тест, используя те же асинхронные вызовы в том порядке, в котором вы их вызываете.Здесь все в порядке.Я подозреваю, что у вас есть проблема с получением ручки для элемента управления Label.Попробуйте разбить эту строку на пару строк, чтобы убедиться, что вы правильно понимаете ручку.Строки действительно возвращают строку?FindControl возвращает элемент управления, который вы хотите?Вероятно, вам следует проверить это в обеих ваших функциях.
И, как примечание, вы можете рассмотреть возможность только индексации в Rows и использования FindControl один раз.Вам нужно заменить объект, который вы передаете в IAsyncResult, тем, который может сохранить дескриптор в метке.Затем вы можете сделать это один раз и назначить его, а затем использовать в UpdateWebserviceStatus.
Редактировать: Попробуйте этот код.
public delegate void WebServiceDelegate(DataKey key);
protected void btnCheckAll_Click(object sender, EventArgs e)
{
foreach (DataKey key in gvTest.DataKeys)
{
WebServiceDelegate wsDelegate = new WebServiceDelegate(GetWebserviceStatus);
wsDelegate.BeginInvoke(key, new AsyncCallback(UpdateWebserviceStatus), wsDelegate);
}
}
public void GetWebserviceStatus(DataKey key)
{
DataRow row = gvTest.Rows[key.Value];
System.Diagnostics.Trace.WriteLine("Row {0} null", row == null ? "is" : "isn't");
Label lblUpdate = (Label)row.FindControl("lblUpdate");
System.Diagnostics.Trace.WriteLine("Label {0} null", lblUpdate == null ? "is" : "isn't");
lblUpdate.Text = string.Format("Updated {0}", key.Value);
}
public void UpdateWebserviceStatus(IAsyncResult result)
{
WebServiceDelegate wsDelegate = (WebServiceDelegate)result.AsyncState;
DataKey key = wsDelegate.EndInvoke(result);
}