我有以下方法:
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传递给这个匿名方法,但它不喜欢它?我怎样才能做到这一点?
Bestregards
编辑1:现在的异常消息是:委托'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);
}
}
}
}
答案 0 :(得分:3)
在这一行:
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
参数,或者考虑采用完全不同的解决方案。