concurrentQueue tryDequeue,结果未知

时间:2013-09-04 09:35:55

标签: c# dynamic deque createinstance concurrent-queue

我试图构建一个灵活的方法来处理不同类型的ConcurrentQueues,因为大多数逻辑处理队列都是一样的。

看起来有点像这样:

private void StartDoWorkButton(object sender, EventArgs e)
    {
        StartDoWork();
    }

    private ConcurrentQueue<TestData> myQueue = new ConcurrentQueue<TestData>();
    private void StartDoWork()
    {
        DoWork(myQueue, new TestData());
    }

    private void DoWork(dynamic queue,object objectType)
    {
        dynamic outResult = Activator.CreateInstance(objectType.GetType());
        while(queue.TryDequeue(out outResult))
        {
            //do something
        }
    }

outResult似乎是正确的类型,但是我得到了这样的信息:&#34;最好的重载方法匹配&#39; System.Collections.Concurrent.ConcurrentQueue.TryDequeue(out WinformWith10pxNewProject1.TestData)&# 39;有一些无效的参数&#34;

事情是,当我这样做时它工作正常:

    private void DoWork(dynamic queue,object objectType)
    {
        TestData outResult;// hardcoded type
        while(queue.TryDequeue(out outResult))
        {
            //do something
        }
    }

有什么办法可以解决这种类型的硬编码问题吗?为我创造的方法提供了很大的灵活性。

亲切的问候,

Matthijs

1 个答案:

答案 0 :(得分:2)

我会使用通用方法:

private void DoWork<T>(ConcurrentQueue<T> queue,object objectType)
{
    T outResult;// generic type
    while(queue.TryDequeue(out outResult))
    {
        //do something
    }
}

这样你可以使用任何类型的ConcurrentQueue&lt; T&GT;

你可以这样称呼:(与硬编码的veriant相同)

private void StartDoWork()
{
    DoWork(myQueue, new TestData());
}

如果你需要&lt; T&GT;要具有特定的基本类型或接口,您可以在其上创建约束:

private void DoWork<T>(ConcurrentQueue<T> queue,object objectType) where T: IDisposable
{
    T outResult;// generic type

    while(queue.TryDequeue(out outResult))
    {
        //do something

        outResult.Dispose();
    }
}

IDisposable就是例如。因此,您可以调用Dispose方法(来自IDisposable)