【问题标题】:Pass parameter to anonymous method?将参数传递给匿名方法?
【发布时间】:2012-12-24 00:42:11
【问题描述】:

我有以下方法:

while (TryCount < 2)
{
    Lock.Try<object>(inCommandObj.Connection, _timeout, delegate(DataSet ds)
    {
        dataAdapter = new OdbcDataAdapter(inCommandObj);
        returningObj = dataAdapter.Fill(ds);
        done = true;
        return returningObj;
    });

    if (done)
        break;

    inCommandObj.Cancel();
}

您可以看到我试图将一个 DataSet 传递给这个匿名方法,但它不喜欢它?我怎样才能做到这一点?

祝福

编辑 1:异常消息现在是:Delegate 'System.Func' 不接受 1 个参数

编辑 2:在这种情况下,我需要使用 dataAdapter.Fill 方法填充现有数据集。这必须使用锁(带 timout)来完成,因为会有很多线程运行此方法。如果锁定超时,我需要取消当前已经冻结的 MySQL 命令,然后尝试发送新命令(1 次)。

编辑 3:这就是锁类的样子:

public static class Lock
    {
        public static T Try<T>(object objLock, int timeout, Func<T> f)
        {
            if (System.Threading.Monitor.TryEnter(objLock, timeout))
            {
                try
                {
                    return f.Invoke();
                }
                finally
                {
                    System.Threading.Monitor.Exit(objLock);
                }
            }
            return default(T);
        }

        public static void Try(object objLock, int timeout, Action f)
        {
            if (System.Threading.Monitor.TryEnter(objLock, timeout))
            {
                try
                {
                    f.Invoke();
                }
                finally
                {
                    System.Threading.Monitor.Exit(objLock);
                }
            }
        }
    }

【问题讨论】:

  • “它不喜欢它”对问题的描述相当糟糕。发生什么了?错误信息是什么?
  • 你想做什么?你的代码伤害了我的眼睛。也许,如果你写你想做的事,有人可以给你一个更好的解决方案。
  • 如果您只是立即重新分配ds,为什么还要传递它?
  • 什么是TryCount,为什么这不是无限循环?
  • 你还没有写出你想要做什么,不管你用锁和监视器做什么都是非常危险的。

标签: c# .net anonymous-methods


【解决方案1】:

在这一行:

public static T Try<T>(object objLock, int timeout, Func<T> f)

Func&lt;T&gt; 正在寻找一个不带参数并返回T 的函数。您正在向它发送一个接受 DataSet 并返回一个对象的委托。

既然您无论如何都要在您的委托中创建一个新的DataSet,只需从委托中删除DataSet ds,您就应该准备就绪。

实际上,您可以将其简化为:

Lock.Try<object>(inCommandObj.Connection, _timeout, () =>
{
    var ds = new DataSet();
    dataAdapter = new OdbcDataAdapter(inCommandObj);
    returningObj = dataAdapter.Fill(ds);
    done = true;
    return returningObj;
});

如果这不符合您的预期,那么您需要重构 Try 以采用不同的 Func 参数,或者考虑完全不同的解决方案。

【讨论】:

  • 如果我将 DataSet 作为参数,会是什么样子?
  • @Ivy - 将声明更改为public static T Try&lt;T&gt;(object objLock, int timeout, Func&lt;T, DataSet&gt; f)
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 2011-07-03
  • 1970-01-01
  • 2015-05-09
  • 2012-01-11
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多