2016-03-28 23 views
0

Ben C# içinde threadPool kullanarak bir olay yürütmeye çalışıyorum. Sorun, olayın NULL'a işaret ettiğini bana gösteriyor.Hata - olay noktaları NULL C#

public class ClientView : IView<string> 
{ 
    event Presenter.func ViewChanged; } 
event Presenter.func IView<string>.ViewChanged 
    { add{}    
     remove{} } 
    public void ClientConnection() 
    { 
     while (true) 
     { 

      int recv = Client.Receive(data); 
      if (recv == 0) break; 
      userInput = Encoding.ASCII.GetString(data, 0, recv); 
      ViewChanged(); //here it crashes because it's null 
     } 
     Client.Close(); 
    } 


class Presenter { 
     private IView<string> view; 
     public delegate void func(); 
     public Presenter(IView<string> view) 
    { 
     this.options = new Dictionary<string, ICommandable>(); 
     options.Add("generate", new Option1()); 
     this.view = view; 

     this.view.ViewChanged += delegate() 
     { 
      string[] input = view.GetUserInput().Split(' '); 
      ThreadPool.QueueUserWorkItem(options[input[0]].execute, input); 
     }; } 

Programın neden çöktüğünü anlamıyorum. benim ViewChanged olayım NULL işaret etmiyor çünkü ben delegeleri ekledim .. hayır?

cevap

1

Hiçbir olay işleyici abone değilse, uygulamanız çökecektir. Muhtemelen olay işleyiciniz eklenmeden önce veri aldınız.

C# 6.0 kullanıyorsanız, ViewChanged?.Invoke() için ViewChanged() değiştirmeyi deneyin, aksi halde aramadan önce ViewChanged() != null olup olmadığını kontrol etmelisiniz.

+0

Fakat bazı olaylara bir yöntem eklemek için sözdizimi nedir? – aviadm71

+0

@ aviadm71 Ne demek istediğinizden emin değilim, ancak şunu okumana önerin: https://msdn.microsoft.com/en-us/library/orm-9780596521066-01-17.aspx –

0

En son C# 'yi kullandığımdan beri birkaç mevsim oldu, bu yüzden bu bir "cevap" olmayabilir, ama ... "+ =" operatörünün kullanımını ve aradığınızı görmekteyim. adresine atıfta bulunmak yerine "delegate()". Bu kod parçası bana doğru görünmüyor. . . (Ve eğer yanılıyorsam, lütfen bu cevaba bir yorum ekleyin!)

+0

+ = operatör Bir olay işleyicisi ekleme yolu ve delegesi() sadece parametresiz bir temsilci. Temsilci anahtar sözcüğü olmadan da bir lambda olabilir. –

+0

Bu yüzden, Sami'nin “ben * yanlış * olduğumu gözlemlemesine” dikkat ediyorum. Açıklama için teşekkürler ve cevabımı geri çekiyorum. –