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
我会为此使用一个通用方法:
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)