小编n3b*_*ula的帖子

TPL数据流:如何限制整个管道?

我想限制在Dataflow管道中发布的项目数.项目数取决于生产环境.这些对象占用大量内存(图像),因此我想在管道的最后一个块完成其工作时发布它们.

我试图使用a SemaphoreSlim来限制生产者并在管道的最后一个块中释放它.它可以工作,但如果在此过程中引发异常,程序将永远等待,并且不会拦截异常.

这是一个看起来像我们的代码的示例.我怎样才能做到这一点 ?

static void Main(string[] args)
{
    SemaphoreSlim semaphore = new SemaphoreSlim(1, 2);

    var downloadString = new TransformBlock<string, string>(uri =>
    {
        Console.WriteLine("Downloading '{0}'...", uri);
        return new WebClient().DownloadString(uri);
    });

    var createWordList = new TransformBlock<string, string[]>(text =>
    {
        Console.WriteLine("Creating word list...");

        char[] tokens = text.ToArray();
        for (int i = 0; i < tokens.Length; i++)
        {
            if (!char.IsLetter(tokens[i]))
                tokens[i] = ' ';
        }
        text = new string(tokens);

        return text.Split(new char[] { ' ' },
           StringSplitOptions.RemoveEmptyEntries);
    });

    var filterWordList = …
Run Code Online (Sandbox Code Playgroud)

.net c# throttling task-parallel-library tpl-dataflow

5
推荐指数
1
解决办法
2022
查看次数