这个javascript技巧是不是有C#对应物来避免过多的递归
Posted
技术标签:
【中文标题】这个javascript技巧是不是有C#对应物来避免过多的递归【英文标题】:Is there a C# counterpart to this javascript trick for avoiding too much recursion这个javascript技巧是否有C#对应物来避免过多的递归 【发布时间】:2020-09-03 10:18:30 【问题描述】:在 javascript 中,当方法调用自身时,可以通过将递归调用包装在 setTimeout
中来防止“递归过多”错误。例如,此事件处理程序使用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 组件一次更新一个数据行,即使 data
包含数千行并且可能需要 5 或 10 甚至 60如果 data
数组只是一次性全部输入到 UI,则会出现几秒钟或更长时间。当数组以许多小位被馈送到 UI 时,用户立即开始在屏幕上看到数据。 (FWIW,实际应用是文本语料库搜索,其中返回许多包含用户搜索词或搜索短语的文本段落。)
可以在 C# 中使用 Stack
和异步 await
完成与此类似的操作吗?阅读this question and answer,似乎不能,至少不容易。如果可以在 C# 中做类似的事情,它是如何实现的?
【问题讨论】:
您使用的是哪种用户界面? Windows 窗体? Windows Presentation Foundation? 您不需要依赖 JavaScript 技巧。 c# 有很多处理线程和异步编程的能力。忘记那些技巧,拥抱 c# 方法 @JesúsLópez:这正是我的问题。对应的 C# 方法有哪些。 @JesúsLópez:我的 UI 是 Blazor,在这里我是个完全的新手。 Blazor 服务器还是 Blazor WebAssembly? 【参考方案1】:我认为您的代码可以在 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);
【讨论】:
只是递归是没有必要的 @JesúsLópez:你是对的。我尝试向 Timrecursive version
展示我也会用非递归版本更新我的答案,谢谢你的观点以上是关于这个javascript技巧是不是有C#对应物来避免过多的递归的主要内容,如果未能解决你的问题,请参考以下文章