是否有与此 javascript 技巧相对应的 C# 来避免过多的递归

Is there a C# counterpart to this javascript trick for avoiding too much recursion

在 javascript 中,当方法调用自身时,可以通过将递归调用包装在 setTimeout 中来防止 "too much recursion" 错误。例如,此事件处理程序使用 array.shift() 和递归而不是循环,一次将一项添加到淘汰可观察数组:

$(document).on("AddPizzaFan", function (event, data, results) {

    var item = data.shift();
    var fan =   new PizzaFan(

                     item['firstname'],
                     item['lastname'],
                     item['favoritePizzaTopping']

        )
    myObservableArray.push(fan);
    if (data.length > 0) {
        setTimeout(function () { $(document).trigger("AddPizzaFan", [data, myObservableArray]); }, 1);
    }

});

这种方法允许绑定到 KO observable 的 UI 组件一次更新一个数据行,使 UI 看起来快速且响应迅速,即使 data 包含数千个的行,否则可能需要 5 或 10 甚至 60 秒或更长时间才能出现,如果 data 数组只是一次全部馈送到 UI。当数组以许多小位馈送到 UI 时,用户会立即开始在屏幕上看到数据。 (FWIW,实际应用是文本语料库搜索,其中返回许多包含用户搜索词或搜索短语的文本段落。)

可以用 C# 中的 Stack 和异步 await 来完成类似的事情吗?看了this question and answer,好像不能,至少不容易。如果可以在 C# 中做类似的事情,它是如何完成的?

我认为您的代码可以在 c# 中实现如下:

递归实现:

async Task RecursiveTask(Stack<object> data, Queue<object> myObservableArray)
{
    if (data.Count > 0)
    {
        myObservableArray.Enqueue(data.Pop()); // or any other logic
        await Task.Delay(1000);
        await RecursiveTask(data, myObservableArray);
    }
}

非递归实现(推荐):

async Task RecursiveTask(Stack<object> data, Queue<object> myObservableArray)
{
    while (data.Count > 0)
    {
        myObservableArray.Enqueue(data.Pop()); // or any other logic
        await Task.Delay(1000);
    }
}