2012-05-25 112 views
5

我有一个多线程应用程序。我只想要一个线程来执行我的函数和其他线程来传递它,而我的函数正在执行。我怎样才能做到这一点?C#只有一个线程执行

我的方法是这样的:

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); 
     } 
    } 

回答

10

您可以组合使用的锁定对象与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

+3

其他线程不会在锁上排队吗?这似乎不是OP要求的内容 –

+0

@MatthewEvans是的,我误解了*通过*的含义。我认为编辑处理正确。 –

1

您可以使用Mutex

using System; 
using System.Threading; 

class Test 
{ 
    // Create a new Mutex. The creating thread does not own the 
    // Mutex. 
    private static Mutex mut = new Mutex(); 
    private const int numIterations = 1; 
    private const int numThreads = 3; 

    static void Main() 
    { 
     // Create the threads that will use the protected resource. 
     for(int i = 0; i < numThreads; i++) 
     { 
      Thread myThread = new Thread(new ThreadStart(MyThreadProc)); 
      myThread.Name = String.Format("Thread{0}", i + 1); 
      myThread.Start(); 
     } 

     // The main thread exits, but the application continues to 
     // run until all foreground threads have exited. 
    } 

    private static void MyThreadProc() 
    { 
     for(int i = 0; i < numIterations; i++) 
     { 
      UseResource(); 
     } 
    } 

    // This method represents a resource that must be synchronized 
    // so that only one thread at a time can enter. 
    private static void UseResource() 
    { 
     // Wait until it is safe to enter. 
     mut.WaitOne(); 

     Console.WriteLine("{0} has entered the protected area", 
      Thread.CurrentThread.Name); 

     // Place code to access non-reentrant resources here. 

     // Simulate some work. 
     Thread.Sleep(500); 

     Console.WriteLine("{0} is leaving the protected area\r\n", 
      Thread.CurrentThread.Name); 

     // Release the Mutex. 
     mut.ReleaseMutex(); 
    } 
} 
0

你可以给一个名称,你的线程和方法

+0

而你如何同步呢? –

0

这个怎么样解决检查名称:

private AutoResetEvent are = new AutoResetEvent(); 

public void setOutput(int value) 
{ 
    // Do not wait (block) == wait 0ms 
    if(are.WaitOne(0)) 
    { 
     try 
     { 
      // Put your code here 
     } 
     finally 
     { 
      are.Set() 
     } 
    } 
} 

这似乎是比锁定对象更容易(更便宜),但可能不太清楚。