concurrentQueue尝试退出队列,结果未知

本文关键字:结果 未知 队列 退出 concurrentQueue | 更新日期: 2023-09-27 18:30:11

我正在尝试构建一个灵活的方法来处理不同类型的并发队列,因为处理队列的大多数逻辑都是相同的。

它看起来有点像:

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的类型似乎是正确的,但我收到这样的消息:"与System.Collections.Concurrent.CurrentQueue.TryDequeue(out WinformWith10pxNewProject1.TestData)匹配的最佳重载方法有一些无效参数"

问题是,当我这样做的时候,它工作得很好:

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

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

问候,

Matthijs

concurrentQueue尝试退出队列,结果未知

我会为此使用一个通用方法:

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

通过这种方式,您可以使用任何类型的ConcurrentQueue<T> 。

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

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

如果您需要<T> 要成为特定的基类型或接口,可以在其上创建约束:

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)