c# – 代码有什么问题

前端之家收集整理的这篇文章主要介绍了c# – 代码有什么问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这让我很难理解这种情况下的实际行为.实际上在没有执行任务时会发生什么事情,但是稍后当SemaphoreSlim被处置时.它引发了我的异常 –
System.ObjectDisposedException {“信号量已被释放.”}

我有一个类库 –

public class ParallelProcessor
{
    private Action[] actions;
    private int maxConcurrency;

    public ParallelProcessor(Action[] actionList,int maxConcurrency)
    {
        this.actions = actionList;
        this.maxConcurrency = maxConcurrency;
    }

    public void RunAllActions()
    {
        if (Utility.IsNullOrEmpty<Action>(actions))
            throw new Exception("No Action Found!");

        using (SemaphoreSlim concurrencySemaphore = new SemaphoreSlim(maxConcurrency))
        {
            foreach (Action action in actions)
            {
                Task.Factory.StartNew(() =>
                {
                    concurrencySemaphore.Wait();
                    try
                    {
                        action();
                    }
                    finally
                    {
                        concurrencySemaphore.Release();
                    }
                });
            }
        }
    }
}

并使用它像 –

class Program
{
    static void Main(string[] args)
    {
        int maxConcurrency = 3;
        Action[] actions = new Action[] { () => Console.WriteLine(1),() => Console.WriteLine(2),() => Console.WriteLine(3) }; //Array.Empty<Action>();

        ParallelProcessor processor = new ParallelProcessor(actions,maxConcurrency);

        processor.RunAllActions();

        Console.ReadLine();
    }
}

有人可以请点亮一下吗?提前致谢.

解决方法

问题是你的使用声明.这就是事情的发生方式:

>创建信号量
>启动在后台运行的任务
>处理信号量
>任务尝试使用信号量……但不能,因为它被处理掉了

选项:

>只需删除using语句(这样你就不会丢弃信号量,但除非你真的大量使用它,否则这不太可能是一个问题)>将您的方法更改为阻止(在using语句中),直到完成所有任务,例如通过使用Parallel.ForEach而不是直接调用Task.Factory.StartNew>更改代码以在任务中处理信号量,该任务仅在所有其他任务完成后执行

猜你在找的C#相关文章