110,536
社区成员
发帖
与我相关
我的任务
分享
[Export(typeof(IAdd)), ExportMetadata(nameof(INameMetaData.Name), nameof(FastAdd))]
public class FastAdd : IAdd
{
public int Add(int x, int y) { return x + y; }
}
[Export(typeof(IAdd)), ExportMetadata(nameof(INameMetaData.Name), nameof(SlowAdd))]
public class SlowAdd : IAdd
{
public int Add(int x, int y) { System.Threading.Thread.Sleep(100); return x + y; }
}
public interface IAdd
{
int Add(int x, int y);
}
public interface INameMetaData
{
string Name { get; }
}
class Program
{
[ImportMany(typeof(IAdd))]
public IEnumerable<Lazy<IAdd, INameMetaData>> adders;
public Program()
{
var catalog = new AggregateCatalog(new AssemblyCatalog(GetType().Assembly));
new CompositionContainer(catalog).ComposeParts(this);
}
static void Main(string[] args)
{
var p = new Program();
foreach(var adder in p.adders)
{
Console.WriteLine(adder.Metadata.Name + " : " + adder.Value.Add(3,4));
}
// 输出
// FastAdd : 7
// SlowAdd : 7
}
}
另外,如果某个实现设置为shared共享单例,那多次调用而且调用方法里对一个公共变量加一,是不是相互影响,如果是多线程同时调用,是不是变量加一不是线程安全的
使用一个公共方法,而不是变量,来实现并发安全,比如
public class My
{
private int count;
public int Increment()
{
return Interlocked.Increment(ref count);
}
}