2012-05-25 13 views
5

Çok dilli bir uygulamam var. İşlevimi yürütürken işlevimi ve diğer konuları iletmek için yalnızca bir iş parçacığı istiyorum. Bunu nasıl yapabilirim? Sen Monitor.TryEnter ile birlikte bir kilit nesnesini kullanabilirsinizC# Sadece Bir Konu Yürütüyor

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

cevap

10

:

Benim yöntemim şey gibidir. zaman adresinden

private Object outputLock = new Object(); 

public void setOutput(int value) 
{ 
    if Monitor.TryEnter(outputLock) 
    { 
     try 
     { 
      .... your code in here 
     } 
     finally 
     { 
      Monitor.Exit(outputLock); 
     } 
    } 
} 

Sadece bir diş Monitor.TryEnter bloğuna izin verilecektir. Başka bir iş parçacığı içeride iken bir iş parçacığı buraya gelirse, Monitor.TryEnter, false değerini döndürür.

+3

Kilitte başka thread queue olmayacak mı? Bu OP'nin –

+0

@MatthewEvans'ı sorduğu gibi görünmüyor. Evet, ne * pass * demek istedim. Düzenlemenin uygun şekilde yapıldığını düşünüyorum. –

1

? N? Z parçacıkları bir isim verebilir 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

kullanabilir ve

+0

Ve bunu nasıl senkronize edersiniz? –

0

Bunun çözümü hakkında yönteminde adını kontrol edebilirsiniz:

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

Olmak görünüyor kilit nesnesiyle Monitor'dan daha kolay (daha ucuz), ancak belki de çok açık değil.