2

私は非常に大規模なプロジェクトを持っており、可能な限りクリーンで整頓された状態に保つようにしています。Visual Studioでコードアナライザーを実行すると、信頼性エラーが発生し、非常に煩わしいと感じます。私は本当にそれを回避する方法を学びたいです。これが私がしていることの簡単な例です。

これが警告です。

警告1CA2000:Microsoft.Reliability:メソッド'MyExampleClassForStackOverflow.AddFeed(string)'で、オブジェクト' new FeedClassExamle()'へのすべての参照がスコープ外になる前に、System.IDisposable.Disposeを呼び出します。

これが私のサンプルコードです:

class MyExampleClassForStackOverflow : IDisposable
{
    public ConcurrentDictionary<string, FeedClassExamle> Feeds { get; set; }

    public void AddFeed(string id)
    {
        //The warning is coming from this code block.
        //In the full code, the feed classes collects data on a specific 
        //interval and feeds them back using events.
        //I have a bunch of them and they need to be accessible so I 
        //store them in dictionaries using keys to effeciently find them.
        Feeds.TryAdd(id, new FeedClassExamle());
        Feeds[id].Start();
    }
    public void Dispose()
    {
        foreach (var item in Feeds)
            item.Value.Dispose();
    }
}

class FeedClassExamle : IDisposable
{
    public void Start()
    {

    }
    public void Dispose()
    {

    }
}

コードをテストするには、次を使用します。

using (var example = new MyExampleClassForStackOverflow())
{

}

任意の提案を歓迎します。

4

3 に答える 3

1

コード分​​析ツールは、オブジェクトが正しく破棄されるかどうかを判断できないため、警告が表示されます。コードの書き方によっては、オブジェクトは実際には正しく破棄されませんが、コードを修正しても警告は解消されない可能性があります。

基本的に、すべてのメソッドが作成するすべてのインスタンスでAddFeed何かが呼び出されるようにする必要があります。最良の方法は、現在の ID の下の辞書にインスタンスが既に存在する場合、インスタンスを作成しないことです。それができない場合、メソッドは作成したものを破棄する必要がありますが、辞書に保存しないことを決定するか、辞書にあるものと交換します(どのメソッドがそれをサポートしているかわかりません)。 1。必須の要件は、 の実際の実行以外では常に、作成されたが破棄されていないのすべてのインスタンスをディクショナリが保持することです。DisposeFeedClassExampleFeedClassExampleAddFeedFeedClassExampleConcurrentDictionaryDisposeAddFeedFeedClassExample

FeedClassExampleメッセージをログに記録する以外に何もしないデストラクタをクラスに追加すると有益な場合があります。そのクラスを正しく呼び出しDisposeている場合、デストラクタは決して実行されません。呼び出しに失敗した場合は、呼び出しますDispose。したがって、デストラクタが実行された場合、何か間違ったことをしていることがわかります。

于 2012-05-20T20:47:30.513 に答える
1

TryAdd が失敗した場合、オブジェクトは破棄されないため、これを明示的に実行してみてください。

public void AddFeed(string id)
{
    FeedClassExample fce = new FeedClassExamle();
    if (!Feeds.TryAdd(id, fce))
    {
        fce.Dispose();
    } 
    Feeds[id].Start();
}
于 2012-05-20T14:20:53.647 に答える
0

追加する必要がある場合にのみインスタンスを作成します。

if (!Feeds.ContainsKey(id)) {
  Feeds.GetOrAdd(id, new FeedClassExamle());
}
于 2012-05-20T14:36:34.917 に答える