Есть ли способ реализовать подобные Мечу сопрограммы в VB.NET, так как нет никакого ключевого слова урожая

Обратите внимание, что я знаю о других урожайв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#, но это надеется быть выполнимым. Мы будем видеть, существуют ли какие-либо проблемы с этим. Если у кого-либо есть лучшая идея, я внимательно слушаю.

6
задан Community 23 May 2017 в 12:01
поделиться

1 ответ

Насколько я понимаю, обходной путь VB зависит от единообразия различных шагов; другими словами, он повторяет одно и то же действие до тех пор, пока не будет выполнено условие выхода.

Совместные подпрограммы Caliburn, напротив, полезны в противоположном сценарии: неоднородные (и асинхронные) шаги чередуются с управляющим кодом; но это в основном машина состояний.

Фактически, Caliburn использует компилятор C # для получения бесплатной и автоматически сгенерированной реализации конечного автомата; поэтому решением может быть создание простого конечного автомата ручной работы, такого же, как тот, который построен компилятором C # (см. http://blogs.msdn.com/wesdyer/archive/2007/03/23/all-about -iterators.aspx ).

3
ответ дан 17 December 2019 в 18:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: