VS2010 の Booksleeve の 1.1.0.5 バージョンが意図したとおりに機能しません。何が起こっているかというと、操作を実行して待機した後、Booksleeve が接続を閉じた状態のままにすることがあるため、下流の操作で例外がスローされます。
私が抱えている最も簡単な問題はこれです:
static void Main(string[] args)
{
Func<RedisConnection> getNewRedisConnection = () =>
{
RedisConnection conn = new RedisConnection("Belasco");
conn.Error += (obj, eArgs) => { throw eArgs.Exception; };
return conn;
};
RedisConnection redisConn = null;
TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException);
redisConn = getNewRedisConnection();
redisConn.Open();
var test1 = redisConn.Sets.GetAllString(0, "test1");
var testValues1 = test1.Result;
//var testValues1 = redisConn.Wait(test1);
var test2 = redisConn.Sets.GetAllString(0, "test2");
var testValues2 = test2.Result;
//var testValues2 = redisConn.Wait(test2);
redisConn.Close(false);
Console.WriteLine("Done");
Console.ReadKey();
}
static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
throw new NotImplementedException();
}
行var test2 = redisConn.Sets.GetAllString(0, "test2");
は「キューが閉じられています」という例外をスローします。
リクエスト間の接続を閉じて再度開くと、一見うまくいくようです。
var test1 = redisConn.Sets.GetAllString(0, "test1");
var testValues1 = test1.Result;
//var testValues1 = redisConn.Wait(test1);
redisConn.Close(false);
redisConn = getNewRedisConnection();
redisConn.Open();
var test2 = redisConn.Sets.GetAllString(0, "test2");
var testValues2 = test2.Result;
//var testValues2 = redisConn.Wait(test2);
しかし、「設定」操作を実行すると、すべてが壊れた状態に戻るようです。
redisConn = getNewRedisConnection();
redisConn.Open();
var test0 = redisConn.Sets.Add(0, "test1", new string[] { "11", "22", "33", "44", "55" });
redisConn.Wait(test0);
redisConn.Close(false);
redisConn = getNewRedisConnection();
redisConn.Open();
var test1 = redisConn.Sets.GetAllString(0, "test1");
var testValues1 = test1.Result;
//var testValues1 = redisConn.Wait(test1);
redisConn.Close(false);
redisConn = getNewRedisConnection();
redisConn.Open();
var test2 = redisConn.Sets.GetAllString(0, "test2");
var testValues2 = test2.Result;
//var testValues2 = redisConn.Wait(test2);
トランザクションにも同じ問題がありますが、同じ問題に起因していると感じています。値を取得してから別のコマンドをキューに入れる必要がある理由は、Redis でのその後のアクションが、取得した値に基づいて決定されるためです!