Soru & Cevap

Threading in Windows phone ...

04.12.2013 - 07:14

Elimde bir async dosya okuma fonksiyoun var. Acaba bu fonksiyonu thread içinde veya background worker içinde nasıl kullanabilirim?

  private async Task oku()         {             StorageFolder local = ApplicationData.Current.LocalFolder;               if (local != null)             {                 var dataFolder = await local.GetFolderAsync("DataFolder");                   var file = await dataFolder.OpenStreamForReadAsync("Data.txt");                   using (StreamReader streamReader = new StreamReader(file))                 {                     for (int i = 0; i < 61497; i++)                     {                         if (streamReader.ReadLine() != null)                         {                             lst.Add(streamReader.ReadLine());                         }                         else                         {                             break;                         }                     }                 }             }   burada lst bir listedir.           

  

1 Görüntülenme

5 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user omer.birler
omer.birler
07.12.2013 - 12:51

Cevabınız için teşekkürler İbrahim bey. Bunu denedim. Backgroundworker ile user interface elementlerinin direct olarak değiştirilmesi engelleniyor. Ancak elimde birden fazla user interface elementi var olduğu durumda hepsine Dispatcher.BeginInvoke fonksiyonu uygulamak zorunda mıyım? Windows form application lardaki gibi CheckForIllegalCrossThreadCalls = false yapılan bir kontrol mekanizması yok mu? 

  

picture-2361-1379626676.jpg
iersoy
06.12.2013 - 09:40

Amaç UI Thread'ini kitlememek ise,şöyle de bir yapı var:

Dispatcher.BeginInvoke(() =>
{
    //İşlemler
});

 

picture-472-1375079047.jpg
mehmet.altiparmak
05.12.2013 - 06:47

Merhaba Ömer,

async-await uygulama kodunun asenkron bir şekilde (UI threadi bloklamadan) çalışmasını sağlıyor. Ancak tek thread üzerinde çalışıyor okuduğum kadarıyla teknik detayını ben de çok bilmiyorum. Aşağıdaki makaleleri okumanın faydası olacaktır anlamana. 

http://stackoverflow.com/questions/9343594/how-to-call-asynchronous-method-from-synchronous-method-in-c

http://msdn.microsoft.com/en-us/magazine/gg598924.aspx

Elde etmek istediğin uygulama arayüzünün kitlenmemesi, ve hızlı açılması ise bunu asenkron yapıları kullanarak sağlayabilirsin. Bu noktada async-await öneriliyor daha düşük Thread gibi yapıların kullanılmasındansa çünkü o yapıların kullanımı ve yönetimi daha zor. 

Ancak yapmak istediğin bazı hesaplamaların daha hızlı sonuçlanması, bazı verilerin bir yerlerden daha hızlı okunması ise paralelliğe ihtiyacın olacaktır bu durumda paralellik sağlayacak yapılar kullanmalısın Thread, ThreadPool, inceleyebilirsin. Ben kullanmadım ama paralellik istiyorsan Task Parallel Library de incelemelisin sanırım http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx

 

Profile picture for user omer.birler
omer.birler
05.12.2013 - 12:58

Cevabınız için teşekkür ederim Mehmet bey. Burada yapmak istediğim şey programın hızını arttırmak. Async fonksiyonla bunu yapabilir miyim yani async fonksiyon main fonksiyonu yavaşlatır mı? thread yapmam gerekir mi?

picture-472-1375079047.jpg
mehmet.altiparmak
05.12.2013 - 12:37

Merhaba Ömer,

Öncelikle özel bir amaç için yapmadıysan dosyayı birer satır atlayarak lst'e ekliyorsun. Yine özel bir amacın yoksa for dongusu içerisinde break ile çıkmaktansa while ile kontrol edebilirsin okuduğun satırı.

String line = streamReader.ReadLine();

while(!String.IsNullOrEmpty(line))

{

lst.Add(line);

line = streamReader.ReadLine();

Threadinge gelince Async ile biten fonksiyonları kullanarak UI threadin kitlenmesini büyük ölçüde engelleyebilirsin yukarıdaki kod için konuşursak. streamReader.ReadLine yerine StreamReader.ReadLineAsync kullanabilirsin mesela. async methodlar concurrency sağlıyorlar zaten.

Farklı bir thread içerisinde çalıştırmak istiyorsan yukarıdaki fonksiyonu parametre olarak vererek Thread sınıfından bir instance oluşturabilirsin. Daha sonra da oluşan Thread objenin Start methodunu çağırman gerekiyor. 

async-await patterninin getirdiği bir takım yenilikler var ve concurrent uygulama geliştirmeyi oldukça basite indirgiyor. Aşağıdaki linklere göz atıp nasıl çalıştığını ve normal bir thread açmaktan ne farkı olduğunu anlamaya çalışmanı tavsiye ederim.

http://developer.nokia.com/Community/Wiki/Asynchronous_Programming_For_Windows_Phone_8

http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx