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?
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.
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?
datatable a yazan kısmı MethodInvoker ile tanımlanan alana taşıyın. sonra if else kısmını kullanarak, MethodInvoker ı çağırın.