-2

私は次の方法を持っています:

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

1 に答える 1

3

この行で:

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

Func<T>パラメータを取らず、 を返す関数を探していますTDataSetオブジェクトを受け取って返すデリゲートを送信しています。

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か、まったく別のソリューションを検討する必要があります。

于 2013-01-09T19:07:09.487 に答える