2

我有一个带有无限循环方法的 C# 控制台应用程序,看起来像这样

while (true) 
{
    Event eventObj = session.NextEvent();               
    foreach (Message msg in eventObj)   
    {
        System.Console.WriteLine(msg.ToString());
    }
}

我试图以这种方式将其移植到 F#,添加在按下“Q”键时退出循环的功能。

member private this.SynchronousRespsonse =
    let rec checkResponse = 
        let c = System.Console.ReadKey()
        if c.Key = System.ConsoleKey.Q then
                 this.unsubscibe
        else  
            let eventObj : Event = session.NextEvent()
            for msg in eventObj do
                printfn "%A" msg.ToString
     checkResponse

但它不起作用。控制台输出为:

checking...
<fun:checkResonse@41-1>
Unsubscribing ...

如何编写循环以完成与 C# 相同的操作,同时添加一种方便的方式来退出循环?

编辑: 我正在寻找一种方法让它循环检查新事件,但如果按下“Q”键则停止。我不希望它在再次循环之前等待一个键。所以System.Console.ReadKey()可能不是正确的选择。

4

2 回答 2

3

您需要实际定义函数而不仅仅是变量 - 您想要类似的东西

member private this.SynchronousRespsonse() =
        let c = System.Console.ReadKey()
        if c.Key = System.ConsoleKey.Q then
                 this.unsubscibe
        else  
            let eventObj : Event = session.NextEvent()
            for msg in eventObj do
                printfn "%A" msg.ToString
            this.SynchronusResponse()

此外,不需要额外的rec绑定,并且您希望递归仅在else块中发生,以便您可以在Q按下后返回

于 2013-08-01T09:33:01.287 回答
1

感谢 John Palmer 的解决方案,函数的递归/循环部分完全按照我的意愿执行。为了获得我想要的确切的循环停止行为(除非按下“Q”键,否则总是循环)需要更多的按摩。这是最终的解决方案

member private this.SynchronousRespsonse =
    let eventObj : Event = session.NextEvent()
    for msg in eventObj do                    
        // to some stuff here  
    if Console.KeyAvailable && Console.ReadKey().Key = ConsoleKey.Q then
        this.unsubscibe
    else
        this.SynchronousRespsonse
于 2013-08-01T10:56:05.770 回答