15 Mayıs 2018 Salı

Thread Sınıfı

Giriş
Şu satırı dahil ederiz.
using System.Threading;
Constructor
Şöyle yaparız.
Thread thread = new Thread(() =>{...});
MemoryBarrier metodu
Şöyle yaparız.
int a = 5;

// on thread 1
int b = Interlocked.Add(ref a, 5); // b = 10

// on thread 2, at the same time
int c = Interlocked.Add(ref a, 5); // c = 15

// on thread 1
Thread.Sleep(1000); // so we are "sure" thread 2 executed 
Thread.MemoryBarrier(); // just to be sure we are really reading a
bool x1 = (b == 10); // true
bool x2 = (a == 15); // true
SetApartmentState metodu
Şöyle yaparız.
thread.SetApartmentState (ApartmentState.STA);
Interop ile erişilem COM bileşenleri STA thread kullanılmasını gerektirir. Yoksa şöyle bir hata alırız.
Current thread must be set to single thread apartment (STA) mode before OLE calls can be made
Şöyle yaparız.
public static Task<T> StartSTATask<T>(Func<T> func)
{
  var tcs = new TaskCompletionSource<T>();
  Thread thread = new Thread(() =>
  {
    try
    {
      tcs.SetResult(func());
    }
    catch (Exception e)
    {
      tcs.SetException(e);
    }
  });
  thread.SetApartmentState(ApartmentState.STA);
  thread.Start();
  return tcs.Task;
}
Sleep metodu
Sleep (0) yield gibi çalışır. while() içindeki döngülerde işe yarar. Eğer paramtre olarak -1 veya Timeout.Infinite (yani -1) alırsa açıklaması şöyle.
This is a special case that essentially means "sleep until someone prods you" - which another thread can do by calling Thread.Interrupt(). The sleeping thread should then expect to catch a ThreadInterruptedException.
SpinWait metodu
Şöyle yaparız.
Thread.SpinWait(100);
Start metodu
Şöyle yaparız.
thread.Start();
VolatileRead metodu
Şöyle yaparız.
static int stop = 0;

while (Thread.VolatileRead (ref stop) == 0){
  ...
}
VolatileWrite metodu
Şöyle yaparız.
static int stop = 0;

Thread.VolatileWrite (ref stop, 1);

Hiç yorum yok:

Yorum Gönder