【问题标题】:Is the state parameter useful when using a anonymous method in a callback?在回调中使用匿名方法时 state 参数有用吗?
【发布时间】:2014-12-11 18:48:42
【问题描述】:

我正在使用带有 SynchronizationContext 对象的回调来从 WCF 服务更新客户端 UI。

我使用的代码模式如下:

public void SetResults(string callId, IEnumerable<Result> results)
{
    uiSyncContext.Post(new SendOrPostCallback(state => {
            var r = (IEnumerable<Result>)state;
            chart1.Series[callId].Points.DataBindXY(r.Select...
        }, results);
}

Post 方法接受委托和状态对象。没有其他签名。

因为我使用的是匿名方法,所以碰巧我倾向于这样写:

public void SetResults(string callId, IEnumerable<Result> results)
{
    uiSyncContext.Post(new SendOrPostCallback(state => {
            chart1.Series[callId].Points.DataBindXY(results.Select...
        }, null);
}

因为:

  • 它更短
  • 无需演员阵容
  • 无需声明局部变量

虽然可行,但我想知道第二种方法可能涉及哪些风险。

这被认为是安全的吗?结果参数会被后续调用以某种方式“损坏”吗?

【问题讨论】:

    标签: c# winforms anonymous-methods synchronizationcontext


    【解决方案1】:

    这被认为是安全的吗?

    是的。因为

    结果参数会被后续调用以某种方式“损坏”吗?

    没有。 resultsSetResults() 方法的本地方法,因此尽管它正在被捕获,但它不能在其他地方重用/拦截。所有可以访问它的代码都在这里可见。

    说了这么多,我认为它与第一个版本相比并没有太大的改进。

    【讨论】:

    • 如果只有一个参数,肯定提升不大。然而,有些回调传递的参数更多,我直接在匿名函数体中使用它们非常方便。
    • 如果这些回调是强加给你的,那么是的,它可能会有所帮助。但这正是你提出这个问题的原因。
    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多