C# windows 8上的SharpDX.Direct2D1.Bitmap dispose崩溃

C# windows 8上的SharpDX.Direct2D1.Bitmap dispose崩溃,c#,iis,windows-8,directx,sharpdx,C#,Iis,Windows 8,Directx,Sharpdx,在应用程序完成后处理几个SharpDx位图时,我遇到了一个奇怪的崩溃。异常似乎是不可跟踪的,并一直导致IIS崩溃。它不是每次都会发生,在Windows7上也根本不会发生 将DebugDiag用于崩溃报告会生成: Type of Analysis Performed Crash Analysis Machine Name My-Machine-Name Operating System Unexpected Number Of Processors 2 Process I

在应用程序完成后处理几个SharpDx位图时,我遇到了一个奇怪的崩溃。异常似乎是不可跟踪的,并一直导致IIS崩溃。它不是每次都会发生,在Windows7上也根本不会发生

将DebugDiag用于崩溃报告会生成:

Type of Analysis Performed   Crash Analysis 
Machine Name   My-Machine-Name 
Operating System   Unexpected  
Number Of Processors   2 
Process ID   9556 
Process Image   c:\Windows\System32\inetsrv\w3wp.exe 
System Up-Time   3 day(s) 02:43:33 
Process Up-Time   00:00:54 

In w3wp__App Pool__PID__9556__Date__10_13_2014__Time_10_02_32AM__26__Second_Chance_Exception_C0000409.dmp the assembly instruction at MSVCR120_CLR0400!abort+34 in C:\Windows\System32\MSVCR120_CLR0400.dll from Microsoft Corporation has caused an unknown exception (0xc0000409) on thread 21

Thread 21 - System ID 6816
Entry point   clr!Thread::intermediateThreadProc 
Create time   10/13/2014 10:01:53 AM 
Time spent in user mode   0 Days 0:0:14.937 
Time spent in kernel mode   0 Days 0:0:0.250 

.NET Call Stack

Function 
System.Runtime.InteropServices.Marshal.Release(IntPtr) 
System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef) 
System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef) 

Full Call Stack

Function
MSVCR120_CLR0400!abort+34
MSVCR120_CLR0400!purecall+29
WindowsCodecs!CExternalStream::HrClose+44
WindowsCodecs!CExternalStream::~CExternalStream+23
WindowsCodecs!CExternalStream::`vector deleting destructor'+14
WindowsCodecs!CMILCOMBase::InternalRelease+29
d2d1!BitmapRealization::~BitmapRealization+2c0
d2d1!RefCountedObject<BitmapRealization,LockingRequired,DeleteOnZeroReference>::`vector deleting destructor'+29 
d2d1!RefCountedObject<BitmapRealization,LockingRequired,DeleteOnZeroReference>::Release+31
d2d1!D2DBitmap::~D2DBitmap+d7
d2d1!ComObject<D2DBitmap,type_list<ID2D1Bitmap,type_list<ID2DImageStreamSource,type_list<DXCapture::IDxObservedObject,type_list<ID2D1Bitmap1,type_list<ID2D1Image,type_list<DXCapture::IDxObservedObject,type_list<ID2D1Resource,type_list<DXCapture::IDxObservedObject,null_type> > > > > > > >,LockingRequired,RefCountedObject<D2DBitmap,LockingRequired,LockFactoryOnReferenceReachedZero> >::`vector deleting destructor'+14
d2d1!LockFactoryOnReferenceReachedZero::ReferenceReachedZero<RefCountedObject<D2DBitmap,LockingRequired,LockFactoryOnReferenceReachedZero> >+48
d2d1!RefCountedObject<D2DBitmap,LockingRequired,LockFactoryOnReferenceReachedZero>::Release+22
clr!SafeRelease+af
clr!MarshalNative::Release+9a
0x00007ff8`19e35616
0x00007ff8`19e35592
0x00007ff8`19e354b6
0x00007ff8`1a08f40b
0x00007ff8`1a08ea68
0x00007ff8`1a002150
0x00007ff8`1a001d62
0x00007ff8`19ffd941
0x00007ff8`19ffc990
0x00007ff8`19ffc321
0x00007ff8`19923841
0x00007ff8`199236e7
0x00007ff8`1991e9e6
System_Web_ni+2f6221
System_Web_ni+2bd495
System_Web_ni+2dab5a
System_Web_ni+2bd6a3
System_Web_ni+2b75de
System_Web_ni+2c0561
System_Web_ni+2bff92
System_Web_ni+a15a41
clr!UMThunkStub+6e
webengine4!W3_MGD_HANDLER::ProcessNotification+78
webengine4!W3_MGD_HANDLER::DoWork+34f
webengine4!RequestDoWork+34e
webengine4!CMgdEngHttpModule::OnExecuteRequestHandler+21
iiscore!NOTIFICATION_CONTEXT::RequestDoWork+224
iiscore!NOTIFICATION_CONTEXT::CallModulesInternal+198
iiscore!NOTIFICATION_CONTEXT::CallModules+36
iiscore!NOTIFICATION_MAIN::DoWork+4b4
iiscore!W3_CONTEXT_BASE::IndicateCompletion+97
webengine4!MgdIndicateCompletion+60
System_Web_ni+36956b
System_Web_ni+2c074f
System_Web_ni+2bff92
System_Web_ni+a15a41
clr!UM2MThunk_WrapperHelper+43
clr!UM2MThunk_Wrapper+5a
clr!Thread::DoADCallBack+13c
clr!UM2MDoADCallBack+91
clr!UMThunkStub+26d
webengine4!W3_MGD_HANDLER::ProcessNotification+78
webengine4!ProcessNotificationCallback+42
clr!UnManagedPerAppDomainTPCount::DispatchWorkItem+134
clr!ThreadpoolMgr::ExecuteWorkRequest+64
clr!ThreadpoolMgr::WorkerThreadStart+2b6
clr!Thread::intermediateThreadProc+7d
kernel32!BaseThreadInitThunk+d
ntdll!RtlUserThreadStart+1d
进行碰撞分析的分析类型
机器名我的机器名
操作系统意外
处理器数量2
进程ID 9556
进程映像c:\Windows\System32\inetsrv\w3wp.exe
系统启动时间3天02:43:33
处理启动时间00:00:54
在w3wp\uuuuuuuu应用程序池\uuuuuuu PID\uuuuuuu9556\uuuuuuuu日期\uuuuuuuuuuu10\u13\uuuu2014\uuuuuuuuu时间\uuuuu10\u02\uuuu32 AM\uuuuuuuuu26\uuuuuuuuu第二次\uu机会\uuuuuuuuu例外情况\uuuuuu!Microsoft Corporation的C:\Windows\System32\MSVCR120\U CLR0400.dll中的abort+34导致线程21上出现未知异常(0xc0000409)
线程21-系统ID 6816
入口点clr!线程::intermediateThreadProc
创建时间2014年10月13日上午10:01:53
在用户模式下花费的时间0天0:0:14.937
在内核模式下花费的时间0天0:0:0.250
.NET调用堆栈
作用
System.Runtime.InteropServices.Marshal.Release(IntPtr)
System.Web.Hosting.UnsafeisMethods.MgdIndicationCompletion(IntPtr,System.Web.RequestNotificationStatus ByRef)
System.Web.Hosting.UnsafeisMethods.MgdIndicationCompletion(IntPtr,System.Web.RequestNotificationStatus ByRef)
完整调用堆栈
作用
MSVCR120_CLR0400!中止+34
MSVCR120_CLR0400!purecall+29
WindowsCodecs!CExternalStream::hr关闭+44
WindowsCodecs!CExternalStream::~CExternalStream+23
WindowsCodecs!CExternalStream::`vector deleting析构函数'+14
WindowsCodecs!CMILCOMBase::内部释放+29
d2d1!BitmapRealization::~BitmapRealization+2c0
d2d1!RefCountedObject::`vector deleting析构函数'+29
d2d1!RefCountedObject::Release+31
d2d1!D2DBitmap::~D2DBitmap+d7
d2d1!com对象::`vector deleting析构函数'+14
d2d1!LockFactoryOnReferenceRachedzero::ReferenceRachedzero+48
d2d1!RefCountedObject::Release+22
clr!安全释放+自动对焦
clr!MarshalNative::发行版+9a
0x00007ff8`19e35616
0x00007ff8`19e35592
0x00007ff8`19e354b6
0x00007ff8`1a08f40b
0x00007ff8`1a08ea68
0x00007ff8`1a002150
0x00007ff8`1a001d62
0x00007ff8`19ffd941
0x00007ff8`19ffc990
0x00007ff8`19ffc321
0x00007ff8`19923841
0x00007ff8`199236e7
0x00007ff8`1991e9e6
系统网络+2f6221
系统网络+2bd495
系统网络ni+2dab5a
系统网络+2bd6a3
系统网络+2b75de
系统网络\u ni+2c0561
系统网络+2bff92
系统网络+a15a41
clr!UMThunkStub+6e
网络引擎4!W3_MGD_处理程序::ProcessNotification+78
网络引擎4!W3_MGD_处理程序::DoWork+34f
网络引擎4!请求工作+34e
网络引擎4!CMgdEngHttpModule::OnExecuteRequestHandler+21
得分!通知上下文::RequestDoWork+224
得分!通知上下文::CallModulesInternal+198
得分!通知上下文::CallModules+36
得分!主要通知::DoWork+4b4
得分!W3_CONTEXT_BASE::指示完成+97
网络引擎4!MGD指示完成+60
系统网络+36956b
系统网络+2c074f
系统网络+2bff92
系统网络+a15a41
clr!UM2MThunk_包装辅助程序+43
clr!UM2MThunk_包装+5a
clr!线程::DoADCallBack+13c
clr!UM2MDoADCallBack+91
clr!UMThunkStub+26d
网络引擎4!W3_MGD_处理程序::ProcessNotification+78
网络引擎4!ProcessNotificationCallback+42
clr!UnmanagedPerAppDomainMaintPCount::DispatchWorkItem+134
clr!ThreadpoolMgr::ExecuteWorkRequest+64
clr!ThreadpoolMgr::WorkerThreadStart+2b6
clr!线程::intermediateThreadProc+7d
内核32!BaseThreadInitThunk+d
ntdll!RtlUserThreadStart+1d

有人能理解这次事故吗?或者有人知道我如何解决这个问题吗?

终于有机会尝试一下@osexpert的建议

我添加了一个新类来存储流和使用流的各种类(WIC.BitmapDecoder、WIC.BitmapFrameDecode、WIC.FormatConverter),这样当程序完成位图时,它们可以按照正确的顺序进行处理


这已阻止出现错误。不幸的是,我仍然不知道为什么它只发生在Win8上。由于错误是随机发生的,可能是Win7上的时间差异太大,因此错误没有发生。

我已根据您的建议解决了此问题。 这是我的旧代码,当我随机处理它时,它会崩溃

internal class Direct2DTexture2D : ITexture2D, ID2DResource
{
    internal SharpDX.Direct2D1.Bitmap Texture2D;

    internal Direct2DTexture2D(IRenderTarget InRenderTarget, Bitmap InBitmap)
    {
        Direct2DResourceManager.OnResourceCreate(this);
        Direct2DRenderTarget RT = InRenderTarget as Direct2DRenderTarget;

        Texture2D = CreateFromBitmap(RT.RenderTarget, InBitmap);
    }

    internal Direct2DTexture2D(IRenderTarget InRenderTarget, string InFilePath)
    {
        Direct2DResourceManager.OnResourceCreate(this);
        Direct2DRenderTarget RT = InRenderTarget as Direct2DRenderTarget;

        var bitmap = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(InFilePath);

        Texture2D = CreateFromBitmap(RT.RenderTarget, bitmap);
    }

    private SharpDX.Direct2D1.Bitmap CreateFromBitmap(SharpDX.Direct2D1.RenderTarget InRenderTarget, Bitmap InBitmap)
    {

        using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
        {
            InBitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

            using (SharpDX.WIC.BitmapDecoder bitDecorder =
                new SharpDX.WIC.BitmapDecoder(Direct2DDrawingSystem.instance.ImagingFactory,
                ms,
                SharpDX.WIC.DecodeOptions.CacheOnDemand)
                )
            {
                using (SharpDX.WIC.BitmapFrameDecode bfDecode = bitDecorder.GetFrame(0))
                {
                    using (SharpDX.WIC.FormatConverter fConverter = new SharpDX.WIC.FormatConverter(Direct2DDrawingSystem.instance.ImagingFactory))
                    {
                        fConverter.Initialize(bfDecode, SharpDX.WIC.PixelFormat.Format32bppPBGRA, SharpDX.WIC.BitmapDitherType.None, null, 0, SharpDX.WIC.BitmapPaletteType.Custom);

                        return SharpDX.Direct2D1.Bitmap.FromWicBitmap(InRenderTarget, fConverter);
                    }
                }
            }
        }

    }

    public float width { get { return Texture2D.Size.Width; } }

    public float height { get { return Texture2D.Size.Height; } }

    public void Dispose()
    {
        Direct2DResourceManager.OnResourceDestroy(this);

        if (Texture2D!=null)
        {
            Texture2D.Dispose();
            Texture2D = null;
        }            
    }
}
此代码使用using命令在代码周围运行。 下划线代码在所有平台上都运行良好,您可以看到:

 internal class Direct2DTexture2D : ITexture2D, ID2DResource
{
    private System.IO.MemoryStream MemStream;
    private SharpDX.WIC.BitmapDecoder BitDecorder;
    private SharpDX.WIC.BitmapFrameDecode BFDecorde;
    private SharpDX.WIC.FormatConverter fConverter;

    internal SharpDX.Direct2D1.Bitmap Texture2D;

    internal Direct2DTexture2D(IRenderTarget InRenderTarget, Bitmap InBitmap)
    {
        Direct2DResourceManager.OnResourceCreate(this);
        Direct2DRenderTarget RT = InRenderTarget as Direct2DRenderTarget;

        CreateFromBitmap(RT.RenderTarget, InBitmap);
    }

    internal Direct2DTexture2D(IRenderTarget InRenderTarget, string InFilePath)
    {
        Direct2DResourceManager.OnResourceCreate(this);
        Direct2DRenderTarget RT = InRenderTarget as Direct2DRenderTarget;

        var bitmap = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(InFilePath);

        CreateFromBitmap(RT.RenderTarget, bitmap);
    }

    private void CreateFromBitmap(SharpDX.Direct2D1.RenderTarget InRenderTarget, Bitmap InBitmap)
    {
        MemStream = new System.IO.MemoryStream();
        InBitmap.Save(MemStream, System.Drawing.Imaging.ImageFormat.Png);
        BitDecorder = new SharpDX.WIC.BitmapDecoder(Direct2DDrawingSystem.instance.ImagingFactory,
                            MemStream,
                            SharpDX.WIC.DecodeOptions.CacheOnDemand);

        BFDecorde = BitDecorder.GetFrame(0);

        fConverter = new SharpDX.WIC.FormatConverter(Direct2DDrawingSystem.instance.ImagingFactory);

        fConverter.Initialize(BFDecorde, SharpDX.WIC.PixelFormat.Format32bppPBGRA, SharpDX.WIC.BitmapDitherType.None, null, 0, SharpDX.WIC.BitmapPaletteType.Custom);

        Texture2D = SharpDX.Direct2D1.Bitmap.FromWicBitmap(InRenderTarget, fConverter);
    }

    public float width { get { return Texture2D.Size.Width; } }

    public float height { get { return Texture2D.Size.Height; } }

    public void Dispose()
    {
        Direct2DResourceManager.OnResourceDestroy(this);

        if (Texture2D!=null)
        {
            Texture2D.Dispose();
            Texture2D = null;
        }            

        if(fConverter!=null)
        {
            fConverter.Dispose();
            fConverter = null;
        }

        if(BFDecorde != null)
        {
            BFDecorde.Dispose();
            BFDecorde = null;
        }

        if(BitDecorder!=null)
        {
            BitDecorder.Dispose();
            BitDecorder = null;
        }

        if(MemStream!=null)
        {
            MemStream.Dispose();
            MemStream = null;
        }
    }
}

这段代码演示了如何通过sharpdx从C#位图创建direct2d图像。

我发现了一些额外的细节。从VisualStudio运行时,可能会看到在该堆栈引导的同一位置引发访问冲突异常。我也找到了一些解决办法。如果在应用程序池上将Enable 32位应用程序设置为true,则崩溃似乎不再发生。有人能解释为什么会这样吗?我们在服务器2012 x64上也有类似的问题。在Win7和XP(任何cpu)上运行良好。从堆栈跟踪中看到CExternalStream,我疯狂地猜测问题可能是使用Image.FromStream(stream)和流在处理图像之前被处理(文档说流必须始终打开,并且在处理图像之前不得被处理).我们有一个大型应用程序,我可以看到很多地方,我们在处理图像之前处理流,我想这很糟糕。。。但这并不能解释为什么XP和Win7可以工作。客户还声称,如果使用Windows 7 compability模式,则不会发生此崩溃。这不是问题的答案。请考虑将其作为评论发表。