Notice: Undefined index: height in C:\Inetpub\vhosts\egemenciftci.com\httpdocs\wp-content\themes\material-for-coders\includes\thumbnails.php on line 27
Programming – Page 3 – Egemen Çiftci

Programming (26)


Async ve Await ile Asenkron Programlama

Performans dar-boğazlarını önlemek ve genel uygulama duyarlılığını arttırmak için asenkron programlama kullanabiliriz. Ancak, asenkron uygulamalar yazmak için kullanılan geleneksel teknikler, uygulamaları, kodlama, hata ayıklama ve bakım yönünden daha karmaşık hale getirebilir.

Visual Studio 2012, .NET Framework 4.5 ve Windows Runtime ile asenkron programlar yazmak oldukça basitleşti. async ve await niteleyicileri ile derleyici, geliştiricinin yapması gereken zor işleri üzerine aldı ve uygulama senkron kod benzeri mantıksal yapısını koruyabildi. Sonuç olarak, daha az çaba ile asenkron programlamanın tüm avantajlarından faydalanabiliyoruz.

using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApplication
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            LongRunningProcessAsync();

            MessageBox.Show("Started.");
        }

        private async void LongRunningProcessAsync()
        {
            await Task.Run(() =>
            {
                for (int i = 0; i < 5000; i++)
                {
                    Thread.Sleep(1);
                }

                MessageBox.Show("Finished!");
            });

            MessageBox.Show("Awaited message.");
        }
    }
}
<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="150" Width="525">
    <Grid>
        <ProgressBar HorizontalAlignment="Left" Height="10" Margin="8,8,0,0" VerticalAlignment="Top" Width="493" IsIndeterminate="True"/>
        <Button Content="Start" HorizontalAlignment="Left" Margin="200,72,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>
</Window>



Cursor Kullanımı

Bir sonuç kümesinden, satırları almak için kullandığımız işaretçiye CURSOR denir. SELECT komutundan dönen sonuçları ifade eden veri yapısı olarakta düşünebiliriz. Cursor kullanırken dikkatli olmak gerekir. Eğer çok fazla cursor açılır ve kapatılmazsa “ORA-0100: Maximum open cursors exceeded” hatası verebilir.

DECLARE
  CURSOR cur_1 IS
         SELECT tablo_adi FROM tablolar;
  v_tablo_adi tablolar.tablo_adi%TYPE;
  v_sayi INTEGER := 1;
BEGIN
  OPEN cur_1;
  LOOP
     FETCH cur_1 INTO v_tablo_adi;
     IF cur_1%notfound OR v_sayi > 2000 THEN
       EXIT;
     END IF;
     v_sayi := v_sayi + 1;
  END LOOP;
  IF cur_1%ISOPEN THEN
     CLOSE cur_1;
  END IF;
  DBMS_OUTPUT.put_line('Islenen satir sayisi: '||v_sayi);
END;



Kontrolün Özelliğini Properties.Settings’e Bağlamak

Kontrolün herhangi bir özelliğini Properties.Settings’e bağlayarak, az kod ile çok iş yapmak mümkün. Aşağıdaki örnekte CheckBox’ın IsChecked özeliği Properties.Settings’te tanımlı Bool1’e, TextBox’ın Text özelliği ise yine Properties.Settings’te tanımlı String1’e bağlanmıştır. Böylece otomatik olarak değişimler birbirine yansıyacaktır.

<Window x:Class="WpfApplication1.MainWindow"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:Properties="clr-namespace:WpfApplication1.Properties"
   Title="MainWindow" Height="350" Width="525">
   <Grid>
      <CheckBox Content="CheckBox" Height="16" HorizontalAlignment="Left" Margin="12,12,0,0" Name="checkBox1" VerticalAlignment="Top" IsChecked="{Binding Path=Bool1, Source={x:Static Properties:Settings.Default}}" />
      <TextBox Height="23" HorizontalAlignment="Left" Margin="12,34,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=String1, Source={x:Static Properties:Settings.Default}}" />
   </Grid>
</Window>



String Format Kodları

Sayılar:
Specifier Type Format Output (Passed Double 1.42) Output (Passed Int -12400)
c Currency {0:c} $1.42 -$12,400
d Decimal (Whole number) {0:d} System.FormatException -12400
e Scientific {0:e} 1.420000e+000 -1.240000e+004
f Fixed point {0:f} 1.42 -12400.00
g General {0:g} 1.42 -12400
n Number with commas for thousands {0:n} 1.42 -12,400
r Round trippable {0:r} 1.42 System.FormatException
x Hexadecimal {0:x4} System.FormatException cf90

Özel Sayı Biçimlendirme:
Specifier Type Example Output (Passed Double 1500.42) Note
0 Zero placeholder {0:00.0000} 1500.4200 Pads with zeroes.
# Digit placeholder {0:(#).##} (1500).42
. Decimal point {0:0.0} 1500.4
, Thousand separator {0:0,0} 1,500 Must be between two zeroes.
,. Number scaling {0:0,.} 2 Comma adjacent to Period scales by 1000.
% Percent {0:0%} 150042% Multiplies by 100, adds % sign.
e Exponent placeholder {0:00e+0} 15e+2 Many exponent formats available.

Tarihler:
Specifier Type Example (Passed System.DateTime.Now)
d Short date 10/12/2002
D Long date December 10, 2002
t Short time 10:11 PM
T Long time 10:11:29 PM
f Full date & time December 10, 2002 10:11 PM
F Full date & time (long) December 10, 2002 10:11:29 PM
g Default date & time 10/12/2002 10:11 PM
G Default date & time (long) 10/12/2002 10:11:29 PM
M Month day pattern December 10
r RFC1123 date string Tue, 10 Dec 2002 22:11:29 GMT
s Sortable date string 2002-12-10T22:11:29
u Universal sortable, local time 2002-12-10 22:13:50Z
U Universal sortable, GMT December 11, 2002 3:13:50 AM
Y Year month pattern December, 2002

Özel Tarih Biçimlendirme:
Specifier Type Example Example Output
dd Day {0:dd} 10
ddd Day name {0:ddd} Tue
dddd Full day name {0:dddd} Tuesday
f, ff, … Second fractions {0:fff} 932
gg, … Era {0:gg} A.D.
hh 2 digit hour {0:hh} 10
HH 2 digit hour, 24hr format {0:HH} 22
mm Minute 00-59 {0:mm} 38
MM Month 01-12 {0:MM} 12
MMM Month abbreviation {0:MMM} Dec
MMMM Full month name {0:MMMM} December
ss Seconds 00-59 {0:ss} 46
tt AM or PM {0:tt} PM
yy Year, 2 digits {0:yy} 02
yyyy Year {0:yyyy} 2002
zz Timezone offset, 2 digits {0:zz} -05
zzz Full timezone offset {0:zzz} -05:00
: Separator {0:hh:mm:ss} 10:43:20
/ Separator {0:dd/MM/yyyy} 10/12/2002

Numaralandırmalar:
Specifier Type
g Default (Flag names if available, otherwise decimal)
f Flags always
d Integer always
x Eight digit hex.

Bazı Faydalı Örnekler:
String.Format(“{0:(###) ###-####}”, 8005551212); => (800) 555-1212




BusyIndicator Kullanımı

Extended WPF Toolkit içinde işe yarayan birçok kontrol var. BusyIndicator kontrolü bunlardan sadece biri. Aşağıdaki gibi kullanılabilir.

<Grid>
   <extToolkit:BusyIndicator x:Name="_busyIndicator">
      <Button Click="Button_Click">Start Process</Button>
   </extToolkit:BusyIndicator>
</Grid>
private void Button_Click(object sender, RoutedEventArgs e)
{
   BackgroundWorker bw = new BackgroundWorker();
   bw.DoWork += (o, ea) =>
   {
      Thread.Sleep(3000);
   };
   bw.RunWorkerCompleted += (o, ea) =>
   {
      _busyIndicator.IsBusy = false;
   };
   _busyIndicator.IsBusy = true;
   bw.RunWorkerAsync();
}



MultiBinding ve StringFormat

.NET Framework 3.5 SP1 ile gelen özelliklerden biri, ilişkili değerleri kolay biçimlendirmeyi sağlamak için, {{Binding}} ifadeler içinde kullanılabilen StringFormat desteğidir. MultiBinding ile birlikte kullanımı ile ilgili örnek aşağıdadır. Bu örnekte TextBlock’un Text özelliği Name ve Surname adlı iki özelliğe birden bağlanmıştır.

<TextBlock>
   <TextBlock.Text>
      <MultiBinding StringFormat="{}{0} {1}">
         <Binding Path="Name" />
         <Binding Path="Surname" />
      </MultiBinding>
   </TextBlock.Text>
</TextBlock>