Я не уверен, могу ли я объяснить это здесь, но позвольте мне попробовать. Код ниже - это просто показать эту идею, поскольку я просто печатаю ее здесь, не проверяя все в компиляторе.Избавьтесь от кода блокировки
У меня есть метод (скажем Method1), где я делаю две вещи. 1. Вызов метода веб-службы для выполнения действия. 2. После этого я опросу на том же веб-сервисе, чтобы дождаться появления результатов действия.
Итак, в основном что-то вроде следующего.
public class MyClass
{
Method1()
{
// call Web service method
// code for polling
}
}
Однако этот подход блокирует метод 1 до тех пор, пока результаты действия не станут доступны, как определено во время опроса. Я хочу изменить его так, чтобы вызывающий метод 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?
Если вы собираетесь что-то ждать, вы будете блокировать, независимо от того, находится ли он в методе 1 или метод 2. Что-то блокируется, когда вы ждете события. Настоящая проблема заключается в том, что вы, похоже, не понимаете, как работает асинхронность в .NET, и просто делаете это, когда идете вперед. Я предлагаю вам начать с чтения по шаблону Begin/End Asynchronous, и если вы можете использовать .net 4.5, то прочитайте в async/await –
. Я бы склонен просто оставить блок 'Method1()'. Если это проблема для вызывающего, то это то, где он должен обрабатываться, например.используя отдельный поток с любым методом синхронизации, который подходит на более высоком уровне. – HABO
@Eric Спасибо за ваши комментарии. Я должен признать, что я совершенно новичок в асинхронном шаблоне. Я обязательно прочитаю ваши предложенные темы, но вы предполагаете, что я могу реализовать здесь Begin/End Asynchronous pattern. На данный момент мне придется придерживаться .NET 4.0 – BKS