Bu yazımın konusu da Host
edilmiş oyunu Asenkron olarak bulmak ve dahil olmak. Bu işin senkron olarak
yapılışı için bu
yazıma bakabilirsiniz.
Asenkron aramanın senkron
aramaya göre avantajı senkron aramada olduğu gibi arama sonuçlanana kadar
hostun duraksamıyor olması. Bu nedenle tercih edilen yöntemdir. Önce ön tanım
yaparak yazıma başlıyorum.
IAsyncResult : Asenkron olarak iş görebilecek metotları barındıran sınıflar bu
Interface’den türer. Asenkron bir işi başlatan metotların geri dönüş değeridir (NetworkSession.BeginFind()
gibi). Ve Asenkron bir işi bitiren metotlarda 3. parametrenin tipidir
(NetworkSession.EndFind() gibi) Ve ayrıca işleri bitince AsyncCallback
delegate’lerine parametre olarak aktarılırlar.
Yapacağımız iş özetle şu;
BeginFind() metodunu çağırcağız geri dönüş değerini AsyncOturumBul değişkeninde
saklarken, işini bitirdiğinde 4. parametresinde verilen delagate’in gösterdiği
metoda gidecek ve giderken biz belirtmesek de IAsyncResult’un özelliği olarak
sonucu da beraberinde parametre olarak götürecek. Ve burada EndFind() ile
aramayı bitirirken geri dönüş değeri
olark bulduğu oturumların listesini oradaki değişkenimize aktaracak. Gerisi
senkron aramanın aynısı. Şimdi karışık geliyor olsa da kodu inceledikçe anlayacaksınız.
AgIsleri.cs dosyamıza
değişkenler arasına şunu ekleyelim:
/*asenkron arama için IAsyncResult türünde bir nesne tanımlıyoruz;
dikkat edilmesi gereken
nokta, aramaya başlayan metodun
geri dönüş tipi bu
Interface türündendir.*/
IAsyncResult AsyncSonuc = null;
Artık asenkron aramada kullanacağımız
metodu yazabiliriz,
public void AsenkronOturumAra()
{
durum = "Asenkron
arama başlatıldı.";
if
(AsyncSonuc == null)
{
AsyncSonuc = NetworkSession.BeginFind(
NetworkSessionType.SystemLink,
maxLocalOyuncu, null,
new
AsyncCallback(BulunanOturumlariAra), null);
}
}
BeginFind() metodunun ilk 3
parametresi senkron aramadaki Find metoduyla aynı, 4. parametre arama işi
sonuçlandığında gideceği metodu tutan bir delegate , 5. parametre ise aramanın
durumunu tutabiliyor.
İşimiz burada bitmiyor
tabiki, şimdi arama bitip sonuçlar hazır olduğunda delegate aracılığı ile
gidilecek metodu yazalım;
//
görüldüğü gibi buradaki parametre yukarıda kullandığımız
// AsyncSonuc ile aynı türden zaten buraya da
ta kendisi
// gelecek parametre olarak
public void BulunanOturumlariAra(IAsyncResult
result)
{
// bulunan tüm
oturumları tutacak
AvailableNetworkSessionCollection
uygunOturumlar;
//
katılacağımız oturumu tutacak
AvailableNetworkSession
uygunOturum = null;
if
(AsyncSonuc.IsCompleted)
{
// EndFind’ın geri dönüşü koleksyon şeklinde
uygunOturumlar = NetworkSession.EndFind(result);
//
Oyucuncu için slota sahip olan bir oturum arıyoruz
foreach
(AvailableNetworkSession aramadakiOturum in uygunOturumlar)
{
int
OturumSlotlariToplami =
aramadakiOturum.OpenPublicGamerSlots +
aramadakiOturum.OpenPrivateGamerSlots;
if
(OturumSlotlariToplami > aramadakiOturum.CurrentGamerCount)
uygunOturum =
aramadakiOturum;
}
// Uygun bir oturum bulunduysa, bağlan
if
(uygunOturum != null)
{
durum = " " +
uygunOturum.HostGamertag + " adlı hostta
uygun oturum bulundu.";
oturum = NetworkSession.Join(uygunOturum);
}
else
durum = "Hiç uygun oturum bulunamadı.";
}
// Arama
sonucunu sıfırlayıp değişkeni temizliyoruz.
AsyncSonuc = null;
}
Böylece Asenkron aramayı da
tamamladık geriye herzaman olduğu gibi Etkileşim tuşu kalıyor. Ben “A”
(asenkron ara) seçiyorum.
// Asenkron olarak oturum ara
if
(Keyboard.GetState().IsKeyDown(Keys.A))
agYardimcisi.AsenkronOturumAra();
Böylece asenkron arama
konusunu da halletmiş olduk. Network temelleri konusu da artık bitmek üzere çok
az kaldı. Bir dahaki yazıda görüşmek üzere