C # Only one thread running

I have a multithreaded application. I want only one thread to execute my function and other threads in order to pass it during the execution of my function. How can i do this?

My method looks something like this:

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); } } 
+6
source share
5 answers

You can use the lock object in combination with 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); } } } 

Only one thread is allowed Monitor.TryEnter block at a time. If the stream arrives here and the other stream is inside, then Monitor.TryEnter returns false .

+11
source

You can use 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(); } } 
+2
source

You can specify a name for your threads and check the name in the method

0
source

How about this solution:

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

It seems easier (cheaper) than a Monitor with a lock object, but maybe not so clear.

0
source

the accepted answer (at the time of writing fooobar.com/questions/916657 / ... ) is correct, but I think using https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/ lock-statement is more understandable and does basically the same thing.

One thread at a time can execute a block

 private object once = new object(); public void setOutput(int value) { lock (once) { 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); } } } 
0
source

Source: https://habr.com/ru/post/916657/


All Articles