5

奇妙な問題があり、その理由を追跡する手がかりがありません。私の問題を明確に説明しようとします。

私は RTree クラスを持っています。このクラスでは、2 つの四角形を比較したいので (ここではエンベロープと呼び、minX、minY、maxX、maxY が含まれています)、次のような比較クラスがあります。

private class AnonymousXComparerImpl : IComparer
{
    public AnonymousXComparerImpl()
    { }

    public int Compare(object o1, object o2) 
    {
        IEnvelope ea = (IEnvelope)((IBoundable)o1).Bounds;
        IEnvelope eb = (IEnvelope)((IBoundable)o2).Bounds;
        double a = (ea.MinX + ea.MaxX) / 2d;
        double b = (eb.MinX + eb.MaxX) / 2d;
        return a > b ? 1 : a < b ? -1 : 0;
    }
}

この比較子を使用すると、エンベロープの ArrayList を維持して簡単に並べ替えることができます。エンベロープはランダムに追加されます。次のコードを呼び出して、

IComparer.Compare() メソッドが一貫性​​のない結果を返すため、並べ替えできません。値がそれ自体と比較されないか、ある値を別の値と繰り返し比較すると異なる結果が得られます。

sortedChildBoundables.Sort(new AnonymousXComparerImpl());

ここが奇妙な部分です。このエラーは、VistualStudio をインストールしない .net 4.0 でのみ発生します。マシンに VS または .net 4.5 がインストールされている場合、この問題は再現できません。

この場合、なぜそれが起こるのかわかりません。この種の問題をデバッグした経験があれば、とても助かります。

ありがとう、ハワード

4

2 に答える 2

0

考えられる理由の 1 つは、比較中に情報が実際に変更されたことです。

バックグラウンド スレッドで並べ替えを行う場合、比較で同じ項目を 2 回要求したときに異なる値が得られると、このエラーが発生します。

たとえば、比較の実行中にメインスレッドが値の1つを(おそらくデータバインディングによって)更新する場合。

常に一貫した結果が返されるように、比較した値を必ずキャッシュしてください。または、エラーが時々発生する可能性があることを受け入れ、発生した場合は並べ替えをやり直します。

これは、マシン/OS への依存の感覚も説明します。マルチスレッドの問題は、ソフトウェアとハ​​ードウェアの違いによって異なる方法で発生します。

于 2016-01-21T08:27:03.593 に答える