我有一个多线程的应用程序.我希望只有一个线程执行我的函数,而其他线程在执行函数时传递它.我怎样才能做到这一点?
我的方法是这样的:
public void setOutput(int value) { try { GPOs gpos = reader.Config.GPO; gpos[1].PortState = GPOs.GPO_PORT_STATE.TRUE; gpos[2].PortState = GPOs.GPO_PORT_STATE.TRUE; Thread.Sleep(WAIT); gpos[1].PortState = GPOs.GPO_PORT_STATE.FALSE; gpos[2].PortState = GPOs.GPO_PORT_STATE.FALSE; } catch (Exception ex) { logger.Error("An Exception occure while setting GPO to " + value + " " + ex.Message); } }
解决方法
您可以将锁定对象与
Monitor.TryEnter
结合使用.
private Object outputLock = new Object(); public void setOutput(int value) { if Monitor.TryEnter(outputLock) { try { .... your code in here } finally { Monitor.Exit(outputLock); } } }
每次只允许一个线程进入Monitor.TryEnter块.如果一个线程到达此处,而另一个线程在里面,则Monitor.TryEnter返回false.