是否有与此 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);
}
}
在 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);
}
}