🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

2454閲覧

C#のSystem.Runtime.Cachingの構成ファイルの場所

spiderindigo

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2021/01/22 07:34

編集2021/01/25 00:55

現在C#のライブラリ、System.Runtime.Cachingについて調べています。

率直に質問を申し上げますと、System.Runtime.Cachingについての設定が記述されているアプリケーション構成ファイルを見つけられないのですがどこに記述されているのでしょうか?

まずSystem.Runtime.Caching.MemoryCacheについて公式ドキュメントには下記のように記載されていました。
MemoryCache.Default プロパティ

デフォルトのキャッシュインスタンスはコンストラクターによって作成されないため、構成を使用して、デフォルトのキャッシュインスタンスのメモリとポーリング値を明示的に設定する必要があります。 詳細については、<memoryCache>要素(キャッシュ設定)を参照してください。

これをMemoryCacheクラスはプログラム内でnewを使ってインスタンスを作るのではなく、アプリケーション構成ファイルで定義した値を使ってインスタンスを作るということだと解釈しました。

そこでvisualstudioで自作のwindowsFormプロジェクト(SampleMVP)にNugetを使ってSystem.Runtime.Cachingをインストールしました。
そのあとすぐにMemoryCache.Defaultを使用してみたところ、どこからともなく規定値を取得してきました。
実行したコードは以下のものです。

C#

1using System.Runtime.Caching; 2 3//省略 4 5private void button3_Click(object sender, EventArgs e) 6 { 7 var cache = MemoryCache.Default; 8 }

変数cacheのプロパティは以下のものが設定されているようです。
cacheのプロパティ

以下はその状態でのconfigファイルです。
予想ではApp.configか.exe.configに入っているだろうと考えたのですがその中にはありませんでした。

構成ファイルはどこにあるのでしょうか?
不足している説明等ありましたらご指摘お願いします。

packages.config

XML

1<?xml version="1.0" encoding="utf-8"?> 2<packages> 3 <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net472" /> 4 <package id="System.Runtime.Caching" version="5.0.0" targetFramework="net472" /> 5</packages>

App.config

XML

1<?xml version="1.0" encoding="utf-8" ?> 2<configuration> 3 <startup> 4 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> 5 </startup> 6</configuration>

SampleMVP.exe.config

XML

1<?xml version="1.0" encoding="utf-8" ?> 2<configuration> 3 <startup> 4 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> 5 </startup> 6</configuration> 7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

まずconfigファイルに書き込みが絶対に必要という誤解をしておりました。
configファイルに特に記述しない場合はライブラリ内の規定値を使ってMemoryCacheをインスタンス化をします。
なので基本的にはconfigファイルの設定は必要なく、素直にMemoryCache.Defaultを使っていればよさそうです。

アプリケーションにキャッシュインスタンスを1つだけ作成する場合は、キャッシュにアクセスする必要があるときに、既定のキャッシュを使用してDefaultプロパティから参照を取得します。

MemoryCache コンストラクター

以下はもう少し具体的なインスタンス化処理とconfigファイルの記述の仕方について調べたので記載します。
gitにSystem.Runtime.Cachingのソースコードがありました。
System.Runtime.Cachingのソースコード

MemoryCacheにはコンストラクタが3つあります。うち2つを取り上げます。
一つ目がMemoryCache()、
二つ目がMemoryCache(string name,NameValueCollection config = null)

一つ目のMemoryCache()を呼び出すにはMemoryCache.Defaultを使います。
この場合にSystem.Runtime.Cacheが用意した規定値を使ったインスタンスを作成します。
ただし例外があり、configファイルにてMemoryCacheの名前をDefaultで設定を書き込むとその設定が適応されることになっています。

二つ目のMemoryCache(string name,NameValueCollection config = null)を呼び出すには
new MemoryCache("任意の名前")を使います。
configファイルに任意の名前で書き込んだMemotyCacheの値を使ってインスタンスを作成します。
こちらも例外がありconfigファイルに書き込まずに実行すると任意の名前で規定値のインスタンスが作られます。

ここからはどのタイミングでconfigファイルを読み込んでいるのかについて触れます。
読込みはSystem.Runtime.CachingのMemoryCacheStatisticsクラスの
private void InitializeConfiguration(NameValueCollection config)というメソッドの中で行われます。このクラスはMemoryCacheのコンストラクタの処理でインスタンス化されます。

読込み処理で使われるクラスは
System.ConfigurationのConfigurationManager、
System.Runtime.Caching.ConfigurationのMemoryCacheSectionとMemoryCacheElementです。
System.Runtime.Caching.ConfigurationはSystem.Runtime.Cachingライブラリの一部なので特に準備はいりません。

まずconfigファイルからMemoryCacheに関する部分を取り出し、
取り出したものから任意の名前を使って該当部分の設定をMemoryCacheElementに取り出します。
次に値が取り出せていたらその値を使ってインスタンス化、
取り出せなかったら(設定ファイルを記述していない、名前と一致しない)規定値を使ってインスタンス化します。

設定を記述する場合はApp.configに以下の設定を追記すれば大丈夫です。

App.config

XML

1<?xml version="1.0" encoding="utf-8" ?> 2<configuration> 3 <startup> 4 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> 5 </startup> 6<!--ここから--> 7 <system.runtime.caching> 8 <memoryCache> 9 <namedCaches> 10<!--var cache = new MemoryCache("sample")でインスタンス化すると以下の設定が使われる--> 11 <add name="sample" 12 cacheMemoryLimitMegabytes="0" 13 physicalMemoryLimitPercentage="0" 14 pollingInterval="00:02:50" /> 15<!--MemoryCache.Defaultでインスタンス化する場合でも設定を指定することができる。※ただし必須ではない 16何も記述しない場合のDefaultはpollingInterval="00:02:00"でインスタンス化される。 17 <add name="Default" 18 cacheMemoryLimitMegabytes="0" 19 physicalMemoryLimitPercentage="0" 20 pollingInterval="00:02:50" />--> 21 </namedCaches> 22 </memoryCache> 23 </system.runtime.caching> 24<!--ここまで追加--> 25</configuration>

投稿2021/01/27 01:12

編集2021/01/27 01:15
spiderindigo

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちゃんと調べてはいないけど

予想ではApp.configか.exe.configに入っているだろうと考えたのですがその中にはありませんでした。

とあるが、まさかデフォルトでその記述があるという認識で探してるということだろうか?

<memoryCache> 要素 (キャッシュ設定)

MemoryCache クラスに基づくキャッシュを構成するために使用される要素を定義します。

と書かれている通り、自分で追記するモノだと思うけど。

投稿2021/01/23 00:08

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spiderindigo

2021/01/25 01:05

gentaroさん ありがとうございます。そもそも実行すらしていなかったということが情報不足を招いていました。 そこで試しに特に自分ではconfigファイルに設定していない状態で実行してみたのですがどこからともなく規定値を取得してきました。 何かお気づきの点がありましたらまたご指摘いただけると幸いです。
gentaro

2021/01/25 01:07

いや、追記見ても何が言いたいのかわかんないけど。 「どこからともなく既定値(not規定値)」って、そりゃフレームワークの内部実装でそういう既定値がセットされてたらそういう動きになるでしょ。
spiderindigo

2021/01/27 00:17

gentaroさん おっしゃる通りでした。規定値がライブラリにありそちらを使っていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問