2010-04-29 72 views
0

下面的代码是一个Silverlight应用程序,但在WPF同样的情况,所以它似乎只是我丢失的东西关于委托,事件等为什么这个C#事件处理程序不响应此事件?

谁能告诉我,为什么下面的代码执行成功本次活动:

OnLoadingComplete(this, null); 

,但从来没有执行该事件处理程序? CODE

void initialDataLoader_OnLoadingComplete(object obj, DataLoaderArgs args) 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Controls; 
using System.Diagnostics; 

namespace TestEvent22928 
{ 
    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 

      DataLoader initialDataLoader = new DataLoader("initial"); 
      initialDataLoader.RegisterText("test1", "http://test:111/testdata/test1.txt"); 
      initialDataLoader.RegisterText("test2", "http://test:111/testdata/test2.txt"); 
      initialDataLoader.BeginLoading(); 
      initialDataLoader.OnLoadingComplete += new DataLoader.LoadingComplete(initialDataLoader_OnLoadingComplete); 
     } 

     void initialDataLoader_OnLoadingComplete(object obj, DataLoaderArgs args) 
     { 
      Debug.WriteLine("loading complete"); //WHY DOES EXECUTION NEVER GET HERE? 
     } 
    } 


    public class DataManager 
    { 
     public DataLoader CreateDataloader(string dataloaderIdCode) 
     { 
      DataLoader dataLoader = new DataLoader(dataloaderIdCode); 
      return dataLoader; 
     } 
    } 

    public class DataLoader 
    { 
     public string IdCode { get; set; } 
     public List<DataItem> DataItems { get; set; } 

     public delegate void LoadingComplete(object obj, DataLoaderArgs args); 
     public event LoadingComplete OnLoadingComplete = delegate { }; 

     private int dataItemCurrentlyLoadingIndex; 

     public DataLoader(string idCode) 
     { 
      IdCode = idCode; 
      DataItems = new List<DataItem>(); 
      dataItemCurrentlyLoadingIndex = -1; 
     } 

     public void RegisterText(string idCode, string absoluteSourceUrl) 
     { 
      DataItem dataItem = new DataItem 
      { 
       IdCode = idCode, 
       AbsoluteSourceUrl = absoluteSourceUrl, 
       Kind = DataItemKind.Text 
      }; 
      DataItems.Add(dataItem); 
     } 

     public void BeginLoading() 
     { 
      LoadNext(); 
     } 

     private void LoadNext() 
     { 
      dataItemCurrentlyLoadingIndex++; 
      if (dataItemCurrentlyLoadingIndex < DataItems.Count()) 
      { 
       DataItem dataItem = DataItems[dataItemCurrentlyLoadingIndex]; 
       Debug.WriteLine("loading " + dataItem.IdCode + "..."); 
       LoadNext(); 
      } 
      else 
      { 
       OnLoadingComplete(this, null); //EXECUTION GETS HERE 
      } 
     } 
    } 

    public class DataItem 
    { 
     public string IdCode { get; set; } 
     public string AbsoluteSourceUrl { get; set; } 
     public DataItemKind Kind { get; set; } 
     public object DataObject { get; set; } 
    } 

    public enum DataItemKind 
    { 
     Text, 
     Image 
    } 

    public class DataLoaderArgs : EventArgs 
    { 
     public string Message { get; set; } 
     public DataItem DataItem { get; set; } 

     public DataLoaderArgs(string message, DataItem dataItem) 
     { 
      Message = message; 
      DataItem = dataItem; 
     } 
    } 
} 
+0

你在调试模式下编译? – 2010-04-29 13:01:58

+0

是的,并通过调试器,我发现它永远不会到达事件处理程序 – 2010-04-29 13:03:14

回答

7

你注册的处理程序只有后,你开始加载:

 initialDataLoader.BeginLoading(); 
     initialDataLoader.OnLoadingComplete += new DataLoader.LoadingComplete(initialDataLoader_OnLoadingComplete); 

你的代码是目前写入的方式,看起来像BeginLoading()阻塞直到完成,这意味着处理程序将永远不会被调用,因为直到完成加载后才设置它。

+0

+1。很好地发现。 – 2010-05-01 01:43:36