【问题标题】:concurrentQueue tryDequeue with unknown out resultconcurrentQueue tryDequeue,结果未知
【发布时间】:2013-09-07 18:01:12
【问题描述】:

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

看起来有点像这样:

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.ConcurrentQueue.TryDequeue(out WinformWith10pxNewProject1.TestData)' 的最佳重载方法匹配有一些无效参数”

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

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

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

亲切的问候,

马蒂斯

【问题讨论】:

标签: c# dynamic deque createinstance concurrent-queue


【解决方案1】:

我会为此使用通用方法:

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

这样你就可以使用任何类型的ConcurrentQueue

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

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

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

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)

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 2022-10-18
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多