gpt4 book ai didi

c# - 通用委托(delegate)线程

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:44 24 4
gpt4 key购买 nike

我有一个类 - 在实例化时 - 创建一个后台线程,等待通过 System.Threading.AutoResetEvent 完成的工作。当工作可用时,线程将从通用队列中拉出一个对象进行处理,然后在完成时从该对象调用回调委托(delegate)。

不过细节决定成败:为了完成它的工作,线程调用一个通用函数,因此线程需要知道一个类型。我可以定义队列中的对象来接受泛型,但是如何定义队列来接受真正泛型的对象,也就是说,它的类型可以是任何类型?后台线程如何推断其通用函数调用所需的类型?

示例代码:

class GenericItem<T> 
{
// ... some code ...
}

// somewhere else in code
Queue<GenericItem> myGenericListofItemsToWorkOn;

显然 C# 不喜欢最后一行,因为我试图不指定具体类型,所以我可以执行以下操作:

myGenericListofItemsToWorkOn.Enqueue( new GenericItem<string>() );
myGenericListofItemsToWorkOn.Enqueue( new GenericItem<int>() );

然后我的线程需要执行以下操作:

GenericItem obj = myGenericListofItemsToWorkOn.Dequeue(); // How can I reference a generic item here?
Library.Call<...>(...); // How can I infer the generic type of the item dequeued here?

最佳答案

你不能这样做。你可以做的是上课 GenericItem<T>实现一个非泛型接口(interface)(或从非泛型基类派生),该接口(interface)公开足够的功能供您使用。然后你就可以拥有

Queue<ISomething> myGenericListofItemsToWorkOn;

当您将项目从队列中拉出时 ISomething应该公开足够的功能供您处理每个项目。

更新:这是永远行不通的:

Library.Call<X>(...);

要进行这样的调用,编译器需要知道什么 X是,要么是因为您明确指定了它,要么是因为它可以从 ... 的类型推断出它.但是由于该列表包含不同类型的项目,您只能在运行时告诉您从包中取出了什么,使用 GetType() .你不能既吃蛋糕又吃; Queue必须只包含一种类型的对象,或者 Library.Call不能是“强类型”。

关于c# - 通用委托(delegate)线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10417927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com