哪个最强大? 有什么区别?
1
[Synchronization]
public class Person : ContextBoundObject
{
public void Print(){
Console.WriteLine ("Start");
Thread.Sleep (100);
Console.WriteLine ("END");
}
}
2
private readonly object obj = new object();
public void Print(){
lock (obj) {
Console.WriteLine ("Start");
Thread.Sleep (100);
Console.WriteLine ("END");
}
}
顺便说一句,主要:
Person a = new Person ();
for (int i = 0; i < 10; i++) {
new Thread (a.Print).Start ();
}
我们可以使用这两种方式互换吗?
答案 0 :(得分:3)
SynchronizationAttribute
和ContextBoundObject
是.NET Remoting概念;它们不适用于通用代码,只能在完整的.NET框架上运行(不适用于Windows Phone,Windows应用商店应用或Silverlight)。此外,它会强制您让您的类继承ContextBoundObject
,这可能是不可取的。
另一方面,lock
可以在任何地方使用,并且不会强迫您继承特定的类;它也更细粒度,因为你可以将它应用于需要它的代码,而不是整个类。
因此,除非您的代码专门与远程处理有关,否则我建议不要使用[Synchronization]
。
答案 1 :(得分:0)
我会在方法2上强烈推荐方法1.我将您的问题视为高级别的现实世界实施策略类型的问题。
将Print方法想象为“DoMyMainObjectWorkInThisNewThread()”然后使用新的Thread()设置的模型.Start()会有一个对象在那里执行,然后可以与Person对象上的方法与其他线程进行交互在你的Person类中受到保护。
如果您锁定整个对象,则无法在类级别(例如“当前状态”消息)轻松与您的线程进行交互。
从长远来看,您的方法“1”将保证您具有最大的灵活性,因为您可以使用仅提供锁定的互斥锁或对象,然后使用委托与长时间运行的进程进行交互。 (我假设Thread.Sleep是一个占位符,用于您无法控制的长时间运行的进程。) 然后,您不需要[Synchronization]类属性,并且可以设置更自由的线程方法。
此外,您的方案2将排队打印命令。所以&#34; TryLock&#34;您的Person对象上的概念或新方法,例如&#34; IsPrinting()&#34;或&#34; CanPrint()&#34;可以实施。