将参数传递给匿名方法

本文关键字:方法 参数传递 | 更新日期: 2023-09-27 17:51:05

我有以下方法:

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();
}

你可以看到,我试图传递一个数据集在这个匿名方法,但它不喜欢它?我怎样才能使它成为可能?

Bestregards

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

编辑2:在这种情况下,我需要用dataAdapter填充现有的数据集。填充方法。这必须使用锁(带超时)来完成,因为将有很多线程运行此方法。如果锁超时,我需要取消当前已经冻结的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);
                }
            }
        }
    }

将参数传递给匿名方法

这一行:

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

Func<T>正在寻找一个不带参数并返回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参数,或者考虑一个完全不同的解决方案。