小编Sti*_*lon的帖子

.NET 4.0并发收集性能

我正在尝试编写一个程序,我通过将它们放入不同线程的集合中来安排要删除的项目,并在一个迭代集合的单个线程中清理它们并处理这些项目.

在这样做之前,我想知道什么会产生最佳性能,所以我尝试了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)

.net c# concurrency concurrent-collections

12
推荐指数
1
解决办法
1万
查看次数

实现接口和匹配属性的MEF加载类型

假设我有一个接口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.

.net c# reflection mef

7
推荐指数
1
解决办法
2057
查看次数

标签 统计

.net ×2

c# ×2

concurrency ×1

concurrent-collections ×1

mef ×1

reflection ×1