2014-11-16 30 views
0

我正在创建一个类库的方法,例如,OnetoTen(),它基本上是一个for循环计数从1到10.我想要实现的是调用此方法从另一个程序,并让它输出for循环当前所处的数字/迭代。方法返回循环的进度

使用代表/事件的正确方法是什么?

+1

- 它可能是,取决于你真正的意思是“有输出”。请注意,“输出”可能意味着很多不同的事情:显示到控制台,更新屏幕上的文本,写入文件等。您已经收到一个答案,演示使用委托,作为显式回调对象和作为事件订阅者(事件只是一个抽象成员,允许将委托实例添加到回调代理链中)。如果这不是你想要的,你需要更清楚明确地写出你的问题。 –

+0

彼得,感谢您的反馈,我一定会把它带上! – LuxC

回答

2

您可以使用回调(委托)或事件。

示例使用回调:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var counter = new Counter(); 

     counter.CountUsingCallback(WriteProgress); 

     Console.ReadKey(); 
    } 

    private static void WriteProgress(int progress, int total){ 
     Console.WriteLine("Progress {0}/{1}", progress, total); 
    } 
} 

public class Counter 
{ 
    public void CountUsingCallback(Action<int, int> callback) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      System.Threading.Thread.Sleep(1000); 
      callback(i + 1, 10); 
     } 
    } 

} 

示例使用事件: “正是利用委托/事件以正确的方式去”

class Program 
{ 
    static void Main(string[] args) 
    { 
     var counter = new Counter(); 
     counter.ProgessTick += WriteProgress; 

     counter.CountUsingEvent(); 

     Console.ReadKey(); 
    } 

    private static void WriteProgress(int progress, int total){ 
     Console.WriteLine("Progress {0}/{1}", progress, total); 
    } 
} 

public class Counter 
{ 
    public event Action<int, int> ProgessTick; 

    public void CountUsingEvent() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      System.Threading.Thread.Sleep(1000); 
      if (ProgessTick != null) 
       ProgessTick(i + 1, 10); 
     } 
    } 

} 
+0

谢谢,但是我应该什么时候选择哪个变体?有没有任何指导方针? – KnorxThieus

+1

在这种情况下,我宁愿回调。我认为,如果您不知道您是否会有多少用户,那么事件会更好。这个例子看起来总是只有一件事需要通知。 –

+0

非常感谢! – KnorxThieus