相关疑难解决方法(0)

在.NET中创建阻塞队列<T>?

我有一个场景,我有多个线程添加到队列和多个线程从同一队列读取.如果队列达到特定大小,则填充队列的所有线程将在添加时被阻止,直到从队列中删除项目为止.

下面的解决方案就是我现在正在使用的问题,我的问题是:如何改进?是否有一个对象已经在我应该使用的BCL中启用此行为?

internal class BlockingCollection<T> : CollectionBase, IEnumerable
{
    //todo: might be worth changing this into a proper QUEUE

    private AutoResetEvent _FullEvent = new AutoResetEvent(false);

    internal T this[int i]
    {
        get { return (T) List[i]; }
    }

    private int _MaxSize;
    internal int MaxSize
    {
        get { return _MaxSize; }
        set
        {
            _MaxSize = value;
            checkSize();
        }
    }

    internal BlockingCollection(int maxSize)
    {
        MaxSize = maxSize;
    }

    internal void Add(T item)
    {
        Trace.WriteLine(string.Format("BlockingCollection add waiting: {0}", Thread.CurrentThread.ManagedThreadId));

        _FullEvent.WaitOne();

        List.Add(item);

        Trace.WriteLine(string.Format("BlockingCollection …
Run Code Online (Sandbox Code Playgroud)

.net c# queue collections multithreading

161
推荐指数
6
解决办法
10万
查看次数

是否有异步BlockingCollection <T>?

我想awaitBlockingCollection<T>.Take()异步的结果,所以我不阻止线程.寻找这样的事情:

var item = await blockingCollection.TakeAsync();
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

var item = await Task.Run(() => blockingCollection.Take());
Run Code Online (Sandbox Code Playgroud)

但是有点杀死了整个想法,因为另一个线程ThreadPool被阻止了.

还有其他选择吗?

.net c# collections task-parallel-library async-await

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