在回调中使用匿名方法时,state参数是否有用?

时间:2014-10-16 11:57:27

标签: c# winforms anonymous-methods synchronizationcontext

我正在使用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);
}

由于:

  • 更短
  • 它不遗余力。
  • 无需声明本地变量

虽然它有效,但我想知道第二种方法可能涉及的风险是什么。

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

1 个答案:

答案 0 :(得分:2)

  

这被认为是安全的吗?

是。因为

  

结果参数是否会被子句调用“损坏”?

没有。 resultsSetResults()方法的本地方法,因此虽然它被捕获但无法在其他地方重复使用/拦截。这里可以看到所有可以访问它的代码。

说了这么多,我认为它不比第一个版本好多少。