小编Jos*_*ant的帖子

限制异步任务

我想运行一堆异步任务,并限制在任何给定时间可以完成的任务数量.

假设您有1000个网址,并且您只希望一次打开50个请求; 但只要一个请求完成,您就会打开与列表中下一个URL的连接.这样,一次只打开50个连接,直到URL列表用完为止.

如果可能的话,我也想利用给定数量的线程.

我提出了一种扩展方法,ThrottleTasksAsync可以实现我想要的功能.那里有更简单的解决方案吗?我认为这是一种常见的情况.

用法:

class Program
{
    static void Main(string[] args)
    {
        Enumerable.Range(1, 10).ThrottleTasksAsync(5, 2, async i => { Console.WriteLine(i); return i; }).Wait();

        Console.WriteLine("Press a key to exit...");
        Console.ReadKey(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是代码:

static class IEnumerableExtensions
{
    public static async Task<Result_T[]> ThrottleTasksAsync<Enumerable_T, Result_T>(this IEnumerable<Enumerable_T> enumerable, int maxConcurrentTasks, int maxDegreeOfParallelism, Func<Enumerable_T, Task<Result_T>> taskToRun)
    {
        var blockingQueue = new BlockingCollection<Enumerable_T>(new ConcurrentBag<Enumerable_T>());

        var semaphore = new SemaphoreSlim(maxConcurrentTasks);

        // Run the throttler on a separate thread.
        var t = Task.Run(() => …
Run Code Online (Sandbox Code Playgroud)

c# throttling semaphore async-await tpl-dataflow

52
推荐指数
3
解决办法
2万
查看次数

解析泛型类型时区分">>"和">"

我的第一个Stack Overflow问题.

我一直很好奇这个.

假设您正在解析以下代码行:

List<Nullable<int>> list = new List<Nullable<int>>();
Run Code Online (Sandbox Code Playgroud)

解析时,一个朴素的标记器会假设两个直角括号是一个"右移"标记.我没有用C风格的语言构建任何其他语言构造这个问题.

现代解析器如何处理这个问题?使用这种"贪婪的解析"时是否有解决方法?

我曾考虑在解析器中使用堆栈结构,在解析泛型类型时特别处理这些令牌.我不确定在编写代码编辑器时会有多好.

万分感谢!:)

c# generics parsing

13
推荐指数
1
解决办法
546
查看次数