Asenkron ASP.NET
Yaz aylarında yazdığım Ado.NET kitabinda olmasa da , bu teknoloji içerisinde kullanılacak olan asenkron programlama desenlerinin önemini her konuda karşımıza çıktığı ve çıkacağı gerçektir.
Bu programlama desenlerinde Pooling ve CallBack teknikleri en yoğun kullanılanlardır.Console uygulamasi yazılırken bile dikkat edilecek bir noktadır asenkron programlama biçimi , işler windows ortamina ve web ortamine geçtiğinde ise daha da bir hayati öneme kavuşur.
Bu yazıda , çok basit manada bir asp.net sayfasında asenkron programlama kullanımına bakiyor olacağız.Her zaman söylediğimiz gibi önce keyif alalim yoksa , köşedeki butondan sayfayı kapatalim (:
Öncelikli olarak çok az veri attiğim bir Ms-Sql veritabani hazirliyoruz ve Adı => AsenkronASPNETDB.
Uzerinde bir tablo oluşturuyoruz,bu tablonun adı tblData ve şemasi da görüldüğü gibidir.

MSSQL Database
Hemen arkasindan bu tablo için kayitlar girelim sihirbaz üzerinden

Table Records

Page Design
Şimdi sırada bu veritabani ve tablosundaki verileri kullanacağımız ASP.NET sayfasının tasarimina geçiyoruz
Tasarim oldukca basit bir DataGridView ve bir Label kontrolünden oluşmakta, sayfanın kodlarini paylaştim , içerisinde cok az da olsa CSS kullanıldı pek bir önemi olmasa da , bazı öğrenci arkadaşlarimin dediği gibi işe yaramaz bir Label da yerini almiş oldu (:
Sıra Geldi artik kodlama tarafina , Default.aspx sayfasının tasarim kodlarini paylaşalim
<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default.aspx.cs” Inherits=”_Default” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title>Creacoder.Com – Asenkron Web</title>
<style type=”text/css”>
.metinStil
{
font-family:Calibri;
font-size : small;
color:Navy;
}
</style>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
Asenkron Verilerimiz :<br />
<asp:GridView ID=”_grid” runat=”server”>
</asp:GridView>
<br />
<asp:Label ID=”lblBilgi” runat=”server”></asp:Label>
</div>
</form>
</body>
</html>
C# Kodlarini paylaşalim
-
using System;
-
using System.Data;
-
using System.Web;
-
using System.Web.UI;
-
using System.Data.SqlClient;
-
-
public partial class _Default : System.Web.UI.Page
-
{
-
// sınıf içinde her noktadan erişim için Field değişkenlerimiz
-
-
// zaman kriterlerini kontrol için 2 tane başlangic ve bitiş
-
// değişkenlerimiz
-
static DateTime _beginTime, _endTime;
-
-
// Ado.NET işlemleri için kullanılacak değişkenlerimiz
-
SqlConnection _connection;
-
SqlCommand _command;
-
SqlDataReader _dr;
-
-
protected void Page_Load(object sender, EventArgs e)
-
{
-
// başlangıc zamanı aliniyor..
-
_beginTime = DateTime.Now;
-
-
// Asenkron işlemler için delege örneği üretiliyor… TimeOut konusunda kullanılan 3.parametre
-
// EndEventHandler anonim metot almiştir.
-
{
-
if (_connection != null || _connection.State != ConnectionState.Closed)
-
{
-
_connection.Close();
-
this.Title = "Operasyon Zaman Aşimina Uğradi";
-
}
-
}), null);
-
// Sayfamıza bu asenkron işlemleri kayıt ettiriyoruz.
-
Page.RegisterAsyncTask(task);
-
}
-
-
// Asenkron işlem başlatıldığında tetiklenir.
-
IAsyncResult BeginTask(object sender, EventArgs e, AsyncCallback callBack, object state)
-
{
-
// Bağlantilarin hazirlanmasi
-
// Ado.NET kullananlar cok iyi anlayacaktır ki
-
// egerki asenkron islem kosturulacaksa bunun bağlantı cümlesinde anlatilmasi gerekir
-
// son parametre bu özellik içindir
-
string connectionString = "data source=localhost;initial catalog=AdventureWorks;integrated security=true;Asynchronous Processing=true";
-
_command.Connection = _connection;
-
_command.CommandText = "select ContactID,FirstName,LastName from Person.Contact order by newID() DESC";
-
-
try
-
{
-
_connection.Open();
-
}
-
catch
-
{
-
_connection.Close();
-
}
-
-
// asenkron veri çekme işleminin başlatilmasi
-
return _command.BeginExecuteReader(callBack, state);
-
}
-
-
// Asenkron işlem bittiğinde tetiklenir.
-
void EndTask(IAsyncResult ar)
-
{
-
// asenkron işlemin bittiğinde bu işlem değişkeni üzerinden , field değişken
-
// _dr ‘yı artik doldurabiliriz
-
_dr = _command.EndExecuteReader(ar);
-
}
-
-
// Sayfa arayüze çıkartılırken yapilacak işlemler
-
// metodumuz , sayfadaki DataGridView kontrolünün
-
// veri kaynağını belirtiyoruz,asenkron işlemler sırasında
-
protected override void OnPreRenderComplete(EventArgs e)
-
{
-
_grid.DataSource = _dr;
-
_grid.DataBind();
-
_connection.Close();
-
// tüm bu işlemler sonunda bitiş zamanı…
-
_endTime = DateTime.Now;
-
lblBilgi.Text = string.Format("Arka Plandaki Islemin Süresi : {0} ms", (_endTime - _beginTime).Milliseconds);
-
}
-
-
// Ado.NET kaynaklarinin dispose edilmesi.
-
public override void Dispose()
-
{
-
if (_connection != null) _connection.Close();
-
base.Dispose();
-
}
-
}
buraya kadar geldiğimize göre , yapilmasi gerekenleri paylaşalim,asenkron programlamanın önemi için öncelikle kendi oluşturduğumuz veri kümesinin etkilerini sonrasında ise örnek veritabani olarak seçilen AdventureWorks üzerinde bulunan Person.Contact veri kümesinin etkilerini inceliyor olacağız,bu sebeple ilk test için , connectionString ve CommandText değerlerini görüldüğü gibi görüldüğü kısmı ile değiştirelim
Step 1
Şimdi sıra geldi bu değişim sonrasında sayfamızın vereceği tepkiye , çıktımızı aliyoruz.

Async Test 1
Ve yine değişiklige gidelim connection ve CommandText üzerinde
Step 2
ve çıktımızı alalim …

Async Test 2
Keyifli günler..


