2016-04-12 10 views
0

C# ve kesinlikle OOP kavramları için oldukça yeniyim .. bu yüzden sorumun aptallığını affedin.Bir olay işleyici ile çalışma - ama her zaman değil .. (Nasıl yaparım ...)

İletişim kurmak istediğim bir sistemim var. İlişkili bir yanıtla çağrılabilen bir dizi komut var. (İletişim TCP/IP veya Seri üzerinden yapılır) (Çoklu aktarım mekanizmalarını kullanabilmem için SendMessage ile bir Arayüz uygulardım)

Her komut için bir yöntem oluşturmak ve sonra bunları açıklamak yeterlidir. Cihaz aynı zamanda hareket etmek istediğim mesajların da yayınlanmasına izin veriyor, bu yüzden iyi çalışan bir olay işleyici kullanıyordum ..

Olay işleyicisinde şu anda OK ve ERROR stili mesajlarını yakalarım ancak ideal olarak, yukarıdaki yöntemden de komutu göndermek ve bir hatayı yakalamak ve komuta dayalı bir bool değerini döndürmek istiyorum.

Herkes böyle bir şey yapabileceğimi ve bana doğru yönde işaret edebileceğimi düşünebilir mi?

Teşekkür

David

+0

Çok geniş: Eğer olay yükseldikçe

readonly object _waitLock = new object(); public void Wait() { lock (_waitLock) if (!Monitor.Wait(_waitLock, 3000)) throw new TimeoutException("No communications"); } 

Sinyal aynı anda:


Aksi takdirde basit bir engelleyici olarak kullanmak için iletişim sınıfının içindeki yöntemi olurdu şu anda ne yapıyorsun ve ne istiyorsun? İç yöntemde, etkinliğe abone olabilir, zaman aşımı veya olay işleyicisi çağrılana kadar yürütmeyi engelleyebilir ve ardından bu soru devam ederse devam edebilirsiniz. – Sinatr

+0

Sanırım mevcut olay işleyicisini herhangi bir şey yapmasını engelleyebilirim - örn. kaldırın ve sonra yalnızca bu komutlar yanıtını almak için yöntem içinde yanıtı yakalayın ve sonra tekrar etkinleştirin, ancak doğru hissetmiyor –

+0

Ardından olay işleyicisini kullanmayın. Başka bir sinyal mekaniği sağlayın (örn. 'Monitor.Pulse'/'Monitor.Wait'). Geçmişte, etkinliğe abone olan, belirli bir yanıtı bekleyen ve sonra geri dönecek olan iletişim sınıfı için yardımcı yazdım. Ama sonra 'Monitor' varlığını ([Albahari] (http://www.albahari.com/threading/part4.aspx#_Signaling_with_Wait_and_Pulse)) ve o zamandan beri kullanıyorum. – Sinatr

cevap

0

Etkinliğe beklemek yardımcı kullanabilirsiniz. Geçmişten Bazı çirkin kodu:

public class ComWait 
{  
    ManualResetEvent _waitEvent; 
    SomeEvent _eventHandler; 

    public ComWait() 
    { 
     _waitEvent = new ManualResetEvent(false); 
     _eventHandler = new SomeEvent(Watch); 
    } 

    void Watch() 
    { 
     _waitEvent.Set(); 
    } 

    public bool Wait(int time = 3000) 
    { 
     _waitEvent.Reset(); 
     SomeEvent += _eventHandler; 
     bool result = _waitEvent.WaitOne(time, false); 
     SomeEvent -= _eventHandler; 
     return result; 
    } 
} 

Kullanım olay rised veya zaman aşımı oluşur kadar sade senkron yöntemi engeller

ComWait wait = new ComWait(); 
if(!wait.Wait()) 
    return; // timeout 
// process 

olduğunu. Parametre eklemek kolay olmalıdır: belirli bir olayın engelini kaldırmak ve olay işleyici parametrelerini tekrar arayan kişiye iletmek. Eğer gösterebilir,

lock (_waitLock) 
    Monitor.PulseAll(_waitLock); 
İlgili konular