Я в своем уме пытаюсь решить эту проблему.
У меня есть функция в классе как таковая
public class ReceiveData
{
Dataprovider provider = new DataProvider();
public void ResponseData()
{
foreach(string anItem in TheList)
{
// AllData function is declared in class DataProvider
string result = provider.AllData(anItem);
}
//do something
}
}
Это просто.Тем не менее, что бы я сделал, если бы функции AllData приходилось выполнять асинхронные вызовы функций для получения данных?
Значение, скажем
public class DataProvider
{
MyServiceClient client = new MyServiceClient();
public string AllData (string myItem)
{
client.FormattedDataCompleted += new EventHandler<FormattedDataCompletedEventArgs>(client_FormattedDataCompleted);
client.FormattedDataAsync(myItem);
}
void client_FormattedDataCompleted(object sender, FormattedDataCompletedEventArgs e)
{
// here's where the response comes back.
}
Как вы можете видеть, теперь я не могу просто вызвать функцию AllData ивернуть данные напрямую.
Итак, что мне нужно сделать в функции ResponseData, чтобы убедиться, что я вызываю функцию AllItem и получаю данные обратно из обратного вызова.Обратите внимание, что в этой функции есть цикл, поэтому мне нужно, чтобы все параметры, которые я отправил через цикл, получили соответствующий ответ.
Один из подходов, которые я пробовал, заключался в использовании класса AutoResetEvent.
Я определил обработчик для этого как AutoResetEvent handle = new AutoResetHandle (false);
, затем я добавляю handle.WaitOne () сразу после асинхронного вызова.и в обратном вызове добавлен handle.Set ();
Однако приложения застревают в handle.WaitOne ().Так что я не могу понять, почему это происходит.
Теперь у меня есть теоретическая идея посмотреть, могу ли я иметь обработчик событий в обратном вызове и обработчик событий в классе RecieveData, и если эти двое будут общаться, я смогу получить данные.Но я потратил некоторое время, пытаясь узнать больше об обработчиках событий, но не освоил его.
Так есть ли у кого-нибудь другой подход, идеи?Спасибо!