5 Nisan 2013 Cuma

Returning a value from a thread - .NET

Basit bir paket gönderme programında oluşturduğum thread ler içerisindeki iş fonksiyonlarından sonuçları asekron bir şekilde okumam için yazdığım dinamik sınıf aşağıdadır.

ThreadExecuter sınıfım Thread içersinde çalıştırılacak sınıf fonsiyonu ve sonunda değer döndürecek bir fonksiyon istemektedir.
 
 
    public class ThreadExecuter where T : class
    {
        public delegate void CallBack (T returnValue);
        public delegate T Method();
        private CallBack callBack;
        private Method method;

        private Thread t;

        public ThreadExecuter(Method _method, CallBack _callBack)
        {
            this.method = _method;
            this.callBack = _callBack;

            t = new Thread(this.Process);
        }

        public void Start() 
        {
            t.Start();
        }

        public void Abort()
        {
            t.Abort();
            callBack(null);
        }

        public void Join()
        {
            t.Join();
        }

        private void Process()
        {
            callBack(method());
        }
    }

Test ordamında kodumuzu deniyelim.

 
namespace Tester
{
    class Program
    {
        static void Main(string[] args)
        {
            #region [ Paket Data]
             ...
            #endregion

            for (int i = 0; i < 20; i++)
            {
                Packet packet = new Packet() { Data = data, Host = "www.google.com.tr", Port = 80, Id = i };
                SocketManager sm = new SocketManager() { packet = packet };

                ThreadExecuter te = new ThreadExecuter(sm.Send, writeScreen);
                te.Start();
            }

            Console.WriteLine("bitti.");
            Console.ReadKey();
        }

        private static void writeScreen(Packet p)
        {
            Console.WriteLine(p.Id + " - " + p.Status.ToString());
        }
    }
}
 

Eğer ki Join kullanarak gerçekleştirdiğimizde ;

 ThreadExecuter te = new ThreadExecuter(sm.Send, writeScreen);
                te.Start();
                te.Join();



Hiç yorum yok:

Yorum Gönder