Я не уверен, что смогу хорошо объяснить это здесь, но позвольте мне попробовать. Код ниже просто показывает идею, поскольку я просто набираю его здесь, не проверяя все в компиляторе.
У меня есть метод (скажем, Method1), в котором я делаю две вещи. 1. Вызов метода веб-сервиса для выполнения действия. 2. После этого я опрашиваю тот же объект веб-службы, чтобы дождаться, пока станут доступны результаты действий.
Итак, в основном что-то вроде следующего.
public class MyClass
{
Method1()
{
// call Web service method
// code for polling
}
}
Однако этот подход блокирует метод Method1 до тех пор, пока не станут доступны результаты действий, определенные во время опроса. Я хочу изменить его таким образом, чтобы вызывающий метод Method1 мог вернуться сразу после вызова метода веб-службы и мог каким-то образом сигнализировать, как только результаты веб-службы будут доступны. Поэтому я думаю о том, чтобы иметь объект AutoResetEvent в качестве члена класса, который я установил в сигнальное состояние во время опроса.
public class MyClass
{
public AutoResetEvent autoEvent = new AutoResetEvent(false);
Method1()
{
// call Web service method
}
Method2()
{
// code for polling
// change state of autoEvent to signaled once results are availble
}
}
При таком подходе пользователь этого API просто вызывает Method1, который немедленно возвращается, и он может просто ждать, пока autoEvent получит сигнал. Проблема в том, кто в этом случае будет вызывать Method2?
Method1()
заблокировать. Если это проблема для вызывающего абонента, то именно здесь ее следует обрабатывать, например. использование отдельного потока с любым методом синхронизации, подходящим на более высоком уровне. - person HABO   schedule 01.10.2014