0

AccessViolationExceptionWPF アプリケーションでおかしくなっています。スタックにユーザー コードがないため、これをトラブルシューティングする方法がよくわかりません。また、2 ~ 3 日おきにしか発生しないため、トラブルシューティングが複雑になります。

at MS.Win32.PresentationCore.UnsafeNativeMethods+MILUnknown.Release(IntPtr)
at MS.Win32.PresentationCore.UnsafeNativeMethods+MILUnknown.ReleaseInterface(IntPtr ByRef)
at System.Windows.Media.SafeMILHandle.ReleaseHandle()
at System.Windows.Media.Imaging.BitmapSourceSafeMILHandle.ReleaseHandle()
at System.Runtime.InteropServices.SafeHandle.InternalFinalize()
at System.Runtime.InteropServices.SafeHandle.Dispose(Boolean)
at System.Runtime.InteropServices.SafeHandle.Finalize()

私の画像操作コード(少し簡略化)

private int timerCount;
private void TimerProc() // called from a timer obviously
{
    if(Interlocked.Increment(ref timerCount) !=0)
    {
        Interlocked.Decrement(ref timerCount);
        return;
    }
    try
    {
        byte[] img = FetchImageFromExternalSource(); //returns a jpeg image
        this.Image = LoadImage(new MemoryStream(img));
    }
    finally
    {
        Interlocked.Decrement(ref timerCount);
    }
}

private BitmapImage LoadImage(Stream inputStream)
{
    var bitmapImage = new BitmapImage();
    bitmapImage.BeginInit();
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
    bitmapImage.StreamSource = inputStream;
    bitmapImage.EndInit();
    bitmapImage.Freeze();
    return bitmapImage;
}

private BitmapImage image;
public BitmapImage Image
{
    get
    {
        return image;
    }
    set
    {
        if (image!= value)
        {
            this.dispatcher.BeginInvoke(new Action(()=>
            {
                image = value;
                PropertyChanged(this,new PropertyChangedEventArgs("Image"));
            }),null);
        }
    }
}

既知のバグ (.NET 4) に遭遇したかどうか、または見逃したコードに問題があるかどうかについてのアドバイスをいただければ幸いです。

4

1 に答える 1

0

System.Threading.Timer は、BitmapImage クラスが想定している UI スレッドではなく、バックグラウンド スレッドでコールバックを呼び出します。DispatcherTimerを使用してみてください。

于 2013-05-26T21:21:41.523 に答える