我正在尝试编写一个程序,我通过将它们放入不同线程的集合中来安排要删除的项目,并在一个迭代集合的单个线程中清理它们并处理这些项目.
在这样做之前,我想知道什么会产生最佳性能,所以我尝试了ConcurrentBag,ConcurrentStack和ConcurrentQueue,并测量了添加10000000个项目所需的时间.
我使用以下程序来测试这个:
class Program
{
static List<int> list = new List<int>();
static ConcurrentBag<int> bag = new ConcurrentBag<int>();
static ConcurrentStack<int> stack = new ConcurrentStack<int>();
static ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
static void Main(string[] args)
{
run(addList);
run(addBag);
run(addStack);
run(addQueue);
Console.ReadLine();
}
private static void addList(int obj) { lock (list) { list.Add(obj); } }
private static void addStack(int obj) { stack.Push(obj); }
private static void addQueue(int obj) { queue.Enqueue(obj); }
private static void addBag(int obj) { bag.Add(obj); }
private static void …Run Code Online (Sandbox Code Playgroud) 假设我有一个接口IFileLoader和属性FileTypeAttribute
我用[FileType(".jpg")]在JPEGLoader中实现IFileLoader
我可以使用MEF加载实现IFileLoader的类(JPEGLoader)并将.jpg作为文件扩展名匹配,这样我就可以实现以下方法:
public void IFileLoader GetLoader(string filename);
Run Code Online (Sandbox Code Playgroud)
可以用MEF完成,或者我应该坚持这个:
var allTypes = assemblies.SelectMany(a => a.GetTypes());
var classes = allTypes.Where(t => t.IsClass && ! t.IsAbstract);
var fileLoaders = classes.where(t => typeof(IFileLoader).IsAssignableFrom(t));
var forType = fileLoaders.Where(t => t.GetAtributeValue<FileTypeAttribute,string>(t => t.FileType, string.Empty) == fileType);
var loaderInstances = fileLoaders.Select(t => Activator.CreateInstance(t) as IFileLoader);
Run Code Online (Sandbox Code Playgroud)
或者上面至少变成了ILookup,或者是其他我没想过的东西?
我希望能够在项目的不同程序集中甚至在插件程序集中实现IFileLoader.