Await Event Handler ?
-
merhabalar await ile ornegin webBrowser1_DocumentCompleted eventinin bitişini nasıl beklerim yani soyle ornek vereyim
webBrowser1.navigate(www.google.com);
await ............
webBrowser1.navigate(www.tahribat.com);
....... yerinde await li bir sekilde document completed eventini kullanmak istiyorum yani orada o event bitene kadar bekleyeceksimdiden teşekkürler.
-
wb.Navigate(url);
while(wb.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
MessageBox.Show("bitti");
-
Daft bunu yazdı
wb.Navigate(url);
while(wb.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
MessageBox.Show("bitti");
hocam bu çözüm bence çok kötü. while süresince cpu'nun amına koyarsın.
bu tür event mevzularında kod yapını normalde düşündüğün gibi daha çok event-handling mantığına göre düzenleyip yazman gerekiyor. Yani kodunun satır satır işlenerek değilde bazı durumlarda event yakalayarak çalıştığını düşünüp yazarsan daha sağlıklı kod yazarsın.
-
Daft bunu yazdı
wb.Navigate(url);
while(wb.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
MessageBox.Show("bitti");
bu şekilde biliyorum teşekkür ederim ama await kullanarak yapmaya çalışıyorum yani Application.DoEvents(); dan uzak durmaya calısıyorum cok cpu kullandıgı için
-
while ReadyState
begin
// bu araya sleep komutu eklersen programin freeze arada sapmalar olacaktir.
onun yerine apilerinden faydanalarak alternatif bir sleep fonksiyonu yazabilirsiniz.PeekMessage
,PostQuitMessage
,TranslateMessage
,DispatchMessage
veya
CreateEvent
,MsgWaitForMultipleObjects w32 apilerinden faydalanabilirsin.
end
processMessages ve DoEvents gibi komutlarda freeze eder...
wh0 tarafından 20/Oca/15 17:51 tarihinde düzenlenmiştir -
c# falan bilmem sadece örnek buldum
-
yokmu bi çözüm kaç saattir arıyorum bşy bulamadım yada anlamadım imkansız deildir bence ama nasıl olcak bilmiyorum
-
doz4 bunu yazdı
yokmu bi çözüm kaç saattir arıyorum bşy bulamadım yada anlamadım imkansız deildir bence ama nasıl olcak bilmiyorum
await kullanabilmen için Asycn method olması gerekiyor hocam. Eğer webbrowserin asycn methodları yoksa await kullanamazsın. @saybirs ve @FCN webbrowser ile baya bi uğraşmışlardı belki onlara sorabilirsin.
-
boyle bişey buldum ama bundada hata alıyorum
public static Task WhenDocumentCompleted(this WebBrowser browser)
{
var tcs = new TaskCompletionSource<bool>();
browser.DocumentCompleted += (s, args) => tcs.SetResult(true);
return tcs.Task;
}
kullanımıda bu sekilde;
await browser.WhenDocumentCompleted();form1 için boyle hata veriyor
public partial class Form1 : Form
Extension method must be defined in a non-generic static class
-
TeRRoR bunu yazdıdoz4 bunu yazdı
yokmu bi çözüm kaç saattir arıyorum bşy bulamadım yada anlamadım imkansız deildir bence ama nasıl olcak bilmiyorum
await kullanabilmen için Asycn method olması gerekiyor hocam. Eğer webbrowserin asycn methodları yoksa await kullanamazsın. @saybirs ve @FCN webbrowser ile baya bi uğraşmışlardı belki onlara sorabilirsin.
hocam awaiti suan baska sekillerde kullandıgımda sorun olmuyor yani mesela bi fonksiyon için falan kullanabiliyorum sıkıntım fonksiyon yerine document completeddi kullanabilmek
-
Şöyle bir örnek hazırladım, kendi koduna uygulayabilirsin.
public partial class Form1 : Form { public Form1() { InitializeComponent(); } // olay tetiklenene kadar bekleyen private async void button1_Click(object sender, EventArgs e) { await webBrowser1.NavigateAndWait("http://www.google.com.tr"); Debug.WriteLine("sayfa yüklendi"); // sonraki kodlar } // 10 saniye bekleyip devam eden çağrı private async void button2_Click(object sender, EventArgs e) { var navTask = webBrowser1.NavigateAndWait("http://www.google.com.tr"); if (await Task.WhenAny(navTask, Task.Delay(10000)) == navTask) { Debug.WriteLine("sayfa yüklendi"); } else { Debug.WriteLine("zaman aşımına uğradı"); } // sonraki kodlar } } public static class WebBrowserExtensions { public static Task NavigateAndWait(this WebBrowser browser, string urlString) { var tcs = new TaskCompletionSource<bool>(); browser.Navigate(urlString); browser.DocumentCompleted += (s, args) => { browser.DocumentCompleted -= null; tcs.TrySetResult(true); }; return tcs.Task; } }