14 Kasım 2014 Cuma

İp ucu: NET 2.0 için eski projelerinizde C# için Asenkron Çağrım

Asenkron çalışma veya metod çağırımlarını fazla detaylandırmadan; Programınızda aynı anda birbirinden bağımsız işler yapılma durumu varsa, esneklik anlamında programınızın bir yerinde çok uzun süren işlemler yapıyor ve bu durum sizin programızın kitlenmesi vb sonuçlar üretiyorsa Asenkron programlamayla ilgilenme zamanınız gelmiştir. Aşağıda bir örnek üzerinde devam edeceğim....

using System;

using System.Collections.Generic;

using System.Data;

using System.Data.SqlClient;

using System.Linq;

using System.Text;

using System.Threading.Tasks;



namespace TaskForm2

{

    class OnDataEventArgs : EventArgs

    {

        public DataTable dr;



        public OnDataEventArgs(DataTable ResTable)

        {

            dr = ResTable;

        }

    }



    class AsyncData

    {





        private DataTable DataResult;

//Asenkron olarak çalıştırılacak fonksiyonu tutacak delege



        public delegate DataTable GetAsyncData(string SQL);



//Worker fonksiyonun işi bittiğinde çalıştıracağı event ve delege

        public delegate void OnGetData(object sender, OnDataEventArgs e);

        public event OnGetData OnGetDataCall;



        public AsyncData()

        {

           //init

        }

//Asenkron çağrım için geliştirilmiş fonksiyon

        public void AsyncGetDataSet(GetAsyncData asyncdelegate, string SQL)

        {

            asyncdelegate.BeginInvoke(SQL, new AsyncCallback(AsyncGetDataSetCallBack), asyncdelegate);

        }

//Geri dönüş fonksiyonu

        private void AsyncGetDataSetCallBack(IAsyncResult ar)

        {

            GetAsyncData ret = (GetAsyncData)ar.AsyncState;

            DataResult = ret.EndInvoke(ar);

            //Event Fırlatılıyor

            OnGetDataCall(this,new OnDataEventArgs(DataResult));

        }





//Worker Fonksiyon Asynchronous Processing=true dikkat edin



        public DataTable GetDataSet(string SQL)

        {

            SqlConnection con = new SqlConnection("Data Source=(localdb)\\Projects;Initial Catalog=MyAdventureWorks;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;Asynchronous Processing=true");

            SqlDataAdapter da = new SqlDataAdapter(SQL, con);

            DataSet ds = new DataSet();

            da.Fill(ds);

            return ds.Tables[0];

        }

    }

}





Form1.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;



namespace TaskForm2

{

    public partial class Form1 : Form

    {

        private AsyncData asyncdata;



        public Form1()

        {

            InitializeComponent();

            asyncdata = new AsyncData();

        }



        private void Form1_Load(object sender, EventArgs e)

        {

            AsyncData asyncdata = new AsyncData();

            asyncdata.OnGetDataCall += asyncdata_OnGetDataCall;

            AsyncData.GetAsyncData asyncdel = new AsyncData.GetAsyncData(asyncdata.GetDataSet);

            asyncdata.AsyncGetDataSet(asyncdel,"Select * From Person.Person");

            asyncdata.AsyncGetDataSet(asyncdel, "select * from production.product");



  //Normal

            //dataGridView1.DataSource = asyncdata.GetDataSet("Select * From Person.Person");

            //dataGridView1.DataSource = asyncdata.GetDataSet("select * from production.product");

        }







        void asyncdata_OnGetDataCall(object sender, OnDataEventArgs e)

        {

            //thread safe hale getirin

            //dataGridView1.Invoke((Action)(() => dataGridView1.DataSource = e.dr));

            //veya

            //dataGridView1.Invoke((MethodInvoker)delegate() { dataGridView1.DataSource = e.dr; });

            //veya

            dataGridView1.Invoke((Action)delegate() { dataGridView1.DataSource = e.dr; });

        }

    }

}

Hiç yorum yok:

Yorum Gönder