Mir*_*vic 6 c# vb.net yield coroutine caliburn
我最近和Caliburn一起玩.一堆伟大的东西,包括合作例程的实施.
我正在做的大部分工作都是基于C#的,但现在我也正在为基于Rob的小型MVVM框架的VB.NET专卖店创建架构指南.
除了使用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
Run Code Online (Sandbox Code Playgroud)
我只是无法理解如何在VB中编写一个更复杂的常规方法(如Rob的GameLibrary中的方法):
public IEnumerable<IResult> 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<ExploreGameViewModel>()
.Configured(x => x.WithGame(getGame.Response));
}
else SearchResults = _results.With(search.Response);
yield return Show.NotBusy();
}
Run Code Online (Sandbox Code Playgroud)
任何想法如何实现,或在VB中使用Caliburn协同例程的任何想法?
编辑:
马可指出了一个正确的方向.在查看Rob的GameLibrary的Reflector - Visual Basic代码之后,我设法修改了Bill McCarthy的GenericIterator,成为一个穷人的状态机:
Private _state As Integer = -1
Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
_state += 1
Return _func(_Current, _state)
End Function
Run Code Online (Sandbox Code Playgroud)
我们可以像这样使用它:
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
Run Code Online (Sandbox Code Playgroud)
它肯定不如C#版本那么优雅,但它看起来很可行.我们将看看这是否有任何问题.如果有人有更好的想法,我会全力以赴.
据我了解,VB 解决方法依赖于各个步骤的一致性;换句话说,它重复相同的操作,直到满足退出条件。
相反,Caliburn 协同例程在相反的情况下很有用:与控制代码交错的非同质(异步)步骤;但这基本上是一个状态机。
实际上,Caliburn 利用 C# 编译器来获得免费且自动生成的状态机实现;因此,解决方案可能是构建一个简单的手工状态机,就像 C# 编译器构建的状态机一样(请参阅http://blogs.msdn.com/wesdyer/archive/2007/03/23/all-about-iterators)。 )。
| 归档时间: |
|
| 查看次数: |
775 次 |
| 最近记录: |