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

  1. using System;
  2. using System.Data;
  3. using System.Web;
  4. using System.Web.UI;
  5. using System.Data.SqlClient;
  6.  
  7. public partial class _Default : System.Web.UI.Page
  8. {
  9. // sınıf içinde her noktadan erişim için Field değişkenlerimiz
  10.  
  11. // zaman kriterlerini kontrol için 2 tane başlangic ve bitiş
  12. // değişkenlerimiz
  13. static DateTime _beginTime, _endTime;
  14.  
  15. // Ado.NET işlemleri için kullanılacak değişkenlerimiz
  16. SqlConnection _connection;
  17. SqlCommand _command;
  18. SqlDataReader _dr;
  19.  
  20. protected void Page_Load(object sender, EventArgs e)
  21. {
  22. // başlangıc zamanı aliniyor..
  23. _beginTime = DateTime.Now;
  24.  
  25. // Asenkron işlemler için delege örneği üretiliyor… TimeOut konusunda kullanılan 3.parametre
  26. // EndEventHandler anonim metot almiştir.
  27. PageAsyncTask task = new PageAsyncTask(new BeginEventHandler(BeginTask), new EndEventHandler(EndTask), new EndEventHandler(delegate(IAsyncResult ar)
  28. {
  29. if (_connection != null || _connection.State != ConnectionState.Closed)
  30. {
  31. _connection.Close();
  32. this.Title = "Operasyon Zaman Aşimina Uğradi";
  33. }
  34. }), null);
  35. // Sayfamıza bu asenkron işlemleri kayıt ettiriyoruz.
  36. Page.RegisterAsyncTask(task);
  37. }
  38.  
  39. // Asenkron işlem başlatıldığında tetiklenir.
  40. IAsyncResult BeginTask(object sender, EventArgs e, AsyncCallback callBack, object state)
  41. {
  42. // Bağlantilarin hazirlanmasi
  43. // Ado.NET kullananlar cok iyi anlayacaktır ki
  44. // egerki asenkron islem kosturulacaksa bunun bağlantı cümlesinde anlatilmasi gerekir
  45. // son parametre bu özellik içindir
  46. string connectionString = "data source=localhost;initial catalog=AdventureWorks;integrated security=true;Asynchronous Processing=true";
  47. _connection = new SqlConnection(connectionString);
  48. _command = new SqlCommand();
  49. _command.Connection = _connection;
  50. _command.CommandText = "select ContactID,FirstName,LastName from Person.Contact order by newID() DESC";
  51.  
  52. try
  53. {
  54. _connection.Open();
  55. }
  56. catch
  57. {
  58. _connection.Close();
  59. }
  60.  
  61. // asenkron veri çekme işleminin başlatilmasi
  62. return _command.BeginExecuteReader(callBack, state);
  63. }
  64.  
  65. // Asenkron işlem bittiğinde tetiklenir.
  66. void EndTask(IAsyncResult ar)
  67. {
  68. // asenkron işlemin bittiğinde bu işlem değişkeni üzerinden , field değişken
  69. // _dr ‘yı artik doldurabiliriz
  70. _dr = _command.EndExecuteReader(ar);
  71. }
  72.  
  73. // Sayfa arayüze çıkartılırken yapilacak işlemler
  74. // metodumuz , sayfadaki DataGridView kontrolünün
  75. // veri kaynağını belirtiyoruz,asenkron işlemler sırasında
  76. protected override void OnPreRenderComplete(EventArgs e)
  77. {
  78. _grid.DataSource = _dr;
  79. _grid.DataBind();
  80. _connection.Close();
  81. // tüm bu işlemler sonunda bitiş zamanı…
  82. _endTime = DateTime.Now;
  83. lblBilgi.Text = string.Format("Arka Plandaki Islemin Süresi : {0} ms", (_endTime - _beginTime).Milliseconds);
  84. }
  85.  
  86. // Ado.NET kaynaklarinin dispose edilmesi.
  87. public override void Dispose()
  88. {
  89. if (_connection != null) _connection.Close();
  90. base.Dispose();
  91. }
  92. }

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

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

Async Test 1

Ve yine değişiklige gidelim connection ve CommandText üzerinde

Step 2

Step 2

ve çıktımızı alalim …

Async Test 2

Async Test 2

Keyifli günler..

Leave a Reply

You must be logged in to post a comment.