私は次の方法を持っています:
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: 例外メッセージは次のとおりです: デリゲート 'System.Func' は 1 つの引数を取りません
編集 2: この場合、既存のデータセットを dataAdapter.Fill メソッドで埋める必要があります。このメソッドを実行するスレッドが多数あるため、これはロック (タイムアウト付き) を使用して行う必要があります。ロックがタイムアウトした場合は、フリーズした現在の 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);
}
}
}
}