您以什么方式使用除UI之外的委托和/或事件?

时间:2009-07-13 17:41:45

标签: events delegates coding-style

我很好奇其他开发人员如何使用除响应UI事件之外的委托和/或事件?我个人不会将它们用于响应UI事件以外的任何事情,但我强烈地感觉到我错过了代表和事件的力量。所以我向SO社区提出这个问题,以便我可以就如何将这些工具添加到我的工具库中获得一些想法。

4 个答案:

答案 0 :(得分:2)

在任何情况下,您正在倾听可能随时出现的事件;例如,异步监听套接字,读取XML文件等等。

答案 1 :(得分:1)

活动非常平凡。大多数情况下,您将使用它们来响应UI或开发必须通知用户状态更改的组件。打哈欠。

然而,代表们充满了敬畏和胜利。可能最常见的用途是在Linq。 Linq在整个地方使用lambdas,这是速记代表。

var numbers = new int[]{1,2,3,4,5};
var evenStevens = numbers.Where(x => x % 2 == 0);

另一个常见用途是多线程:

ThreadPool.QueueUserWorkItem(o => DoWork(o));

我使用过的最喜欢的是HtmlHelper扩展方法,它们将渲染html和代码隐藏混合在一起:

    /// <summary>
    /// Helps render a simple list of items with alternating row styles
    /// </summary>
    /// <typeparam name="T">The type of each data item</typeparam>
    /// <param name="html">The HtmlHelper.</param>
    /// <param name="rows">The list of items</param>
    /// <param name="rowTemplate">The row template.</param>
    /// <param name="evenCssClass">The even row CSS class.</param>
    /// <param name="oddCssClass">The odd row CSS class.</param>
    public static void SimpleList<T>(
        this HtmlHelper html,
        IEnumerable<T> rows,
        Action<T, string> rowTemplate,
        string evenCssClass,
        string oddCssClass)
    {
        var even = false;
        foreach (var row in rows)
        {
            rowTemplate(row, even ? evenCssClass : oddCssClass);
            even = !even;
        }
    }

在aspx文件中使用它的一个例子:

<div id="nodes" class="scrollingBlock">>
    <%  Html.SimpleList(
          Model.Nodes,
          (d, css) =>
          {%>
      <div class='<%=css%>'><%=d.Name %></div>
          <%}, "evenRow", "oddRow");%>
</div>

答案 2 :(得分:0)

事件非常适合您可能设置的任何类型的状态机。您为每个状态更改触发一个不同的事件,允许您的程序对这些更改做出反应。

事件的另一个用途可能是让您知道何时从某个长时间运行的任务中解析或下载了新记录。例如,您可能有一个控制器对象,用于下载大型XML文件并从中解析记录。每次成功从文件中解析新记录时,您可能会让该控制器触发事件​​。

答案 3 :(得分:0)

我已经使用事件来通知某个控制类关于长时间运行的应用程序中的当前状态。

在我的情况下,我正在使用新固件更新Windows CE设备,最多可能需要15分钟,因此我会让控制器知道线路何时更新,并通过调用另一个事件来更新进度条。

如上所述,如果你需要知道在不同的线程中发生了什么,那么事件可能会有所帮助,特别是如果操作可能需要相当长的时间。