[]

BeginInvoke, C#, Kafayı çizecem

Dün de bir duyuru eklemiştim. Cevap alamadım ama konuyu biraz daha daraltarak bir daha sorayım.

1. C# uygulamamız var.
2. Bir adet socketten veri okuyan C# dll var. Bu dll'in içinde dönen bir thread socketi dinliyordu.
3. Dll socketten aldığı veriyi parse edip, ana form üzerindeki bir grid'e bind edilmiş bir Datatable'a gömmekteydi.
4. Proje bu şekildeyken, debug modda, f5 vasıtasıyla sorunsuz çalışmaktaydı.
5. Ne zaman ki, bir ctrl+f5 yapalım dedik, UI erişilemez hale geldi.
6. Bu haldeyken, streami dinleyen thread tıkanıyor mu diye bakalım dedik ki, böyle bir durum yok. Text dosyaya yazdırınca akışın devam ettiğini görüyoruz.
7. Nette baktık ki, dışarıdan bir thread ile bir control'ü update etmeye kalkarsan, uygulama donabilirmiş. BeginInvoke kullanmalıymışız.
8. Biz de dll'in içinden begininvoke çağırdık.
9. Ama durum değişmedi.

Ne yapmam lazım? 2 günümü yedi bu iş. C# bilgim de pek yeterli değil, düzgün açıklayamamış olabilirim. Açıklamamı isteyin detaylandırayım gerekirse.

Destek rica ediyorum. Teşekkürler.

 
WPF mi kullanıyorsun? eğer öyle ise Dispatcher.Invoke kullanmayı deneyebilirsin belki?


  • zenlaid  (23.08.11 11:36:36) 
ben begininvoke u şu şekilde kullanıyorum:
MethodInvoker method = delegate
{
// buraya kodu yazıyorsunuz.
};
if(InvokeRequired)
BeginInvoke(method);
else
method.Invoke();

edit: windows forms için geçerli bu cevap.
  • inheritance  (23.08.11 11:36:46 ~ 11:37:11) 
zenlaid, WPF yok, standart Windows Forms App.


inheritance,

yanlış kullanmış olabilirim. Ben şu şekilde yaptım.

Dll'in içinde;

public delegate void TCPListener();

public Boolean Start()
{
....
Listener = new TCPListener(ListenThread);
IAsyncResult result = Listener.BeginInvoke(null, null);
....
}

private void ListenThread()
{
while (m_Active)
{
Thread.Sleep(100);
int lData = m_Stream.Read(m_Buffer, 0,
m_Client.ReceiveBufferSize);
myString = myString.Substring(0, lData);
ParseString(myString);
}
ParseString'in içinde de Datatable'a yazma işlemi yapılıyor.

Bu mimariyi senin dediğin şekle nasıl çevirebilirim?
  • arnold schwarzeneger  (23.08.11 11:50:30) 
datatable a yazan kısmı MethodInvoker ile tanımlanan alana taşıyın. sonra if else kısmını kullanarak, MethodInvoker ı çağırın.


  • inheritance  (23.08.11 12:24:27) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.