高価な接続オブジェクトの静的プロパティは正常に機能しますが、Lazy<>
にラップして、スレッドセーフであることを保証してください。あなたの建設場合
public class FunctionClass
{
private static Lazy<IBucket> LazyBucket = new Lazy<IBucket>(() =>
{
var uri = ConfigurationManager.AppSettings["couchbaseUri"];
var cluster = new Cluster(new ClientConfiguration
{
Servers = new List<Uri> { new Uri(uri) }
});
var bucketName = ConfigurationManager.AppSettings["couchbaseBucketName"];
var bucketPassword = ConfigurationManager.AppSettings["couchbaseBucketPassword"];
return cluster.OpenBucket(bucketName, bucketPassword);
});
// Your actual function implementation
public static async Task Run()
{
// Here you are guaranteed to get back a shared connection object to your bucket that has been
// initalized only once in a thread safe way
var initalizedOnceBucket = LazyBucket.Value;
// do something with the bucket
}
}
:あなたはすべてのあなたの関数全体でバケット再利用可能なを作るの例にリンクされているサンプルのブログ投稿に基づいて
が保証スレッドセーフな方法で呼び出すには、次のようになります高価なオブジェクトは、いくつかの非同期呼び出しに依存する必要があります(私はCouchbase C#クライアントがメソッドの非同期バージョンを持っている可能性があると考えています)。あなたはStephen Clearyが書いた素晴らしいNito.AsyncEx NugetパッケージのAsyncLazy<>
を使うことができます。通常のLazy<>
は.NETに組み込まれているため、外部の依存関係は必要ありません。
静的プロパティとともにLazy <>またはAsyncLazy <>を使用すると、潜在的なスレッドの問題を軽減するのに役立ちます。 –