Обратите внимание, что я знаю о других урожайвvb.netвопросах о здесь на ТАК.
Я играю вокруг с Мечом в последнее время. Набор большого материала там, включая реализацию сопрограмм.
Большая часть работы, которую я делаю, является базирующимся C#, но теперь я также создаю инструкцию по архитектуре для VB.NET только магазин, на основе маленькой платформы Rob MVVM.
Все очень хорошо выглядит кроме использования сопрограмм от VB. Так как VB 10 используется, мы можем попробовать что-то как предложение Bill McCarthy:
Public Function Lines(ByVal rdr as TextReader) As IEnumerable(Of String)
Return New GenericIterator(Of String)
(Function(ByRef nextItem As String) As Boolean
nextItem = rdr.ReadLine
Return nextItem IsNot Nothing
End Function)
End Function
Мне просто не удается постигать, как немного более сложный метод сопрограммы как тот ниже (взятый от GameLibrary Rob) мог быть записан в VB:
public IEnumerable ExecuteSearch()
{
var search = new SearchGames
{
SearchText = SearchText
}.AsResult();
yield return Show.Busy();
yield return search;
var resultCount = search.Response.Count();
if (resultCount == 0)
SearchResults = _noResults.WithTitle(SearchText);
else if (resultCount == 1 && search.Response.First().Title == SearchText)
{
var getGame = new GetGame
{
Id = search.Response.First().Id
}.AsResult();
yield return getGame;
yield return Show.Screen()
.Configured(x => x.WithGame(getGame.Response));
}
else SearchResults = _results.With(search.Response);
yield return Show.NotBusy();
}
Какая-либо идея, как достигнуть этого или каких-либо мыслей об использовании сопрограмм Меча в VB?
Править:
Marco указал на меня на правильное направление. После взгляда в Отражателе - код Visual Basic GameLibrary Rob, мне удалось изменить GenericIterator Bill McCarthy для становления конечным автоматом бедного человека:
Private _state As Integer = -1
Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
_state += 1
Return _func(_Current, _state)
End Function
И мы можем использовать его как это:
Public Function ExecuteSearch() As IEnumerable(Of String)
' If we need some variable shared across states, define it here
Dim someSharedStuff As String = String.Empty
' Notice the second lambda function parameter below - state
Return New GenericIterator(Of IResult)
(Function(ByRef nextItem As IResult, state As Integer) As Boolean
Select Case state
Case 0
someSharedStuff = "First state"
nextItem = Show.Busy
Return True
Case 1
nextItem = Show.SomeLoadingScreen
' Do some additional processing here...
Return True
Case 2
' Do something with someSharedStuff variable...
Console.WriteLine(someSharedStuff)
nextItem = PerforSomemWebServiceCall()
Return True
'...
Case 6
nextItem = Show.NotBusy
Return False
End Select
Return False
End Function)
End Function
Это определенно не столь изящно как версия C#, но это надеется быть выполнимым. Мы будем видеть, существуют ли какие-либо проблемы с этим. Если у кого-либо есть лучшая идея, я внимательно слушаю.
Насколько я понимаю, обходной путь VB зависит от единообразия различных шагов; другими словами, он повторяет одно и то же действие до тех пор, пока не будет выполнено условие выхода.
Совместные подпрограммы Caliburn, напротив, полезны в противоположном сценарии: неоднородные (и асинхронные) шаги чередуются с управляющим кодом; но это в основном машина состояний.
Фактически, Caliburn использует компилятор C # для получения бесплатной и автоматически сгенерированной реализации конечного автомата; поэтому решением может быть создание простого конечного автомата ручной работы, такого же, как тот, который построен компилятором C # (см. http://blogs.msdn.com/wesdyer/archive/2007/03/23/all-about -iterators.aspx ).