У вас есть проблема в том, что ваш вызывающий поток не имеет ни малейшего представления, если переменная была заселена LoadData()
вызова
В Тхи случае вам нужно сделать что-то вроде:
- исполнение блока пока нагрузка не завершит
- Поднять событие, когда нагрузка завершает
- Установите общедоступное поле на заряжающего для указания состояния нагрузки
One (возможно) компромисс будет возвращать пользовательский объект вместо IEnumerable
пользовательский объект может сразу же попытаться загрузить данные и держать повторно пробовать, пока успех. Если результирующий набор пользовательского объекта считывается до того, как возникла нагрузка, заблокируйте нить до завершения загрузки, в противном случае верните результирующий набор
В этом случае вы получаете выгоду, если есть задержка между загрузкой и используемые данные - ваша программа может продолжаться до тех пор, пока не потребуются данные. Является ли это я полезным или нет, полностью зависит от того, для чего вы его используете.
Более подробная информация о блокировке исполнения: Это зависит немного от того, как стало известно, что соединение обратно, но что-то вроде:
Public Sub LoadData(Of T)(ByVal query As ObjectQuery(Of T), ByRef result As IEnumerable(Of T))
While Not Connection.State = ConnectionState.Open
Threading.Thread.Sleep(100) 'Pick a decent value for this delay based on how likely it is the connection will be available quickly
End While
result = 'Use the connection to get your data
End Sub
Есть ли какая-либо причина вы делаете это как sub с параметрами ByRef в отличие от функции? Вы только «возвращаете» один объект, поэтому я не совсем понимаю его преимущества. Не то, чтобы это имело огромное значение функционально, но было бы более читаемым ...
Итак, что происходит, пока вы ждете открытия соединения? – ChaosPandion
Я не думаю, что слово «recuse» означает то, что вы думаете, что это значит. – Gabe
@ChaosPandio: к этому времени выполняются разные запросы: состояние подключения - «ConnectionState.Connecting» и т. Д., Я жду, когда соединение станет «открытым» или, по крайней мере, «закрыто», поэтому я могу явно открыть его, сценарий заключается в том, что соединение задействовано, а LoadData вызывается другим потоком. @Gabe: Я имел в виду рекурсию @ – Shimmy