跟踪 WPF 中的 AccessViolationException

2024-01-07

我编写了一个 WPF 应用程序,它使用许多 Frame 控件来查看相机源。部署后,它崩溃得很随机(从 2 小时到 16 小时以上),我在事件日志中连续看到这些:

System.AccessViolationException: 试图读或写保护 记忆。这通常是一个迹象 其他内存已损坏。在 MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& 味精)在 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame 帧)在 System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame 帧)在 System.Windows.Threading.Dispatcher.Run() 在 System.Windows.Application.RunDispatcher(对象 忽略)在 System.Windows.Application.RunInternal(窗口 窗口)在 System.Windows.Application.Run(窗口 窗口)在 System.Windows.Application.Run() 位于 Status_Station_client.MainClass.Main()

应用程序状态站故障 client.exe,版本 1.0.0.0,邮票 4ad0faa5,错误模块 msvfw32.dll, 版本 5.1.2600.2180,邮票 41109753, 调试? 0,故障地址0x00002642。

关于如何追踪这个问题有什么想法吗?网页确实包含 ActiveX 控件,因此第一个猜测是那里存在问题。

我无法在调试模式下跟踪它。我想到尝试的另一件事是吞掉导航调用的异常,但我不确定这是否是明智之举:

try
{
    if (Frame1 != null)
        Frame1.Source = new Uri(uriWithResolution);
}
catch (AccessViolationException ex)
{
    // log message
}

编辑:这是更多的源代码,我对错误在哪里(即抛出异常的位置)感到困惑

MatrixView.cs:

public partial class MatrixView : Window
{
    System.Timers.Timer timer;
    int pageNumber = 0;
    IEnumerable<List<CameraInfo>> _cameraList;
    GlobalSettings _globalSettings;
    Screen _screen;

    public MatrixView(List<CameraInfo> cameras, int pageFlipInterval, int camerasPerPage, GlobalSettings globalSettings, Screen screen)
    {
        InitializeComponent();
        _globalSettings = globalSettings;
        _screen = screen;
        _cameraList = Partition<CameraInfo>(cameras, camerasPerPage);

        this.Dispatcher.UnhandledException += new DispatcherUnhandledExceptionEventHandler(Dispatcher_UnhandledException);

        displayCameras();

        timer = new System.Timers.Timer(pageFlipInterval * 1000); // interval (in seconds) * 1000 ms / s
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
        timer.Enabled = true;

        this.KeyUp += new System.Windows.Input.KeyEventHandler(MatrixView_KeyUp);

        if (globalSettings.FullScreenOnLoad)
        {
            this.WindowStyle = WindowStyle.None;
        }
    }

    void MatrixView_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (this.WindowStyle == WindowStyle.None)
        {
            if (e.Key == Key.F11 || e.Key == Key.Escape)
            {
                this.WindowStyle = WindowStyle.SingleBorderWindow;

            }
        }
        else
        {
            if (e.Key == Key.F11)
            {
                this.WindowStyle = WindowStyle.None;
            }
        }
        this.WindowState = WindowState.Maximized;

    }

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new ThreadStart(delegate()
        {
            displayCameras();

        }));

    }

    void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        EventLog.WriteEntry("Matrix Monitor", string.Format("Unhandled exception from Matrix Dispatcher\r\nMessage: {0}\r\nSource: {1}\r\nInnerException: {2}\r\nStack Trace: {3}\r\nFull String: {4}", e.Exception.Message, e.Exception.Source, e.Exception.InnerException, e.Exception.StackTrace, e.Exception.ToString()));
        e.Handled = true;
    }

    private void displayCameras()
    {
        foreach (var child in uniformGrid1.Children)
        {
            FrameTimer c = child as FrameTimer;
            if (c != null)
            {
                c.Dispose();
                c = null;
            }
        }
        GC.Collect();
        GC.WaitForPendingFinalizers();

        uniformGrid1.Children.Clear();
        List<CameraInfo> camerasInPage = _cameraList.ElementAt(pageNumber);
        int numCameras = camerasInPage.Count;

        int sqrtOfCameras = (int) Math.Sqrt(numCameras);
        double height = _screen.Bounds.Height / sqrtOfCameras;
        double width = _screen.Bounds.Width / sqrtOfCameras;
        foreach (CameraInfo camera in camerasInPage)
        {
            uniformGrid1.Children.Add(new FrameTimer(camera, _globalSettings, height, width));
        }
        pageNumber++;
        if (pageNumber >= _cameraList.Count<List<CameraInfo>>())
        {
            pageNumber = 0;
        }



    }
    public static IEnumerable<List<T>> Partition<T>(IList<T> source, int size)
    {
        int remainder = source.Count % size == 0 ? 0 : 1;
        for (int i = 0; i < (source.Count / size) + remainder; i++)        
            yield return new List<T>(source.Skip(size * i).Take(size)); 
    }
}

帧定时器.cs:

public partial class FrameTimer : UserControl, IDisposable
{

    System.Timers.Timer timer;
    string _uri;
    string _noImageUrl;
    bool? _successState = null;
    GlobalSettings _globalSettings;
    CameraInfo _camera;
    Ping ping;
    double _height;
    double _width;

    public FrameTimer(CameraInfo camera, GlobalSettings globalSettings, double height, double width)
    {
        InitializeComponent();

        _noImageUrl = AppDomain.CurrentDomain.BaseDirectory + "noImage.jpg";
        _globalSettings = globalSettings;
        _camera = camera;
        _height = height;
        _width = width;

        _uri = string.Format("http://{0}:{1}/LiveView.aspx?camera={2}", globalSettings.ServerIPAddress, globalSettings.ServerPort, camera.camName);
        this.Dispatcher.UnhandledException += new DispatcherUnhandledExceptionEventHandler(Dispatcher_UnhandledException);

        setUrl();

        timer = new System.Timers.Timer(_globalSettings.PingInterval * 1000); 
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        timer.Enabled = true;

    }

    void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        EventLog.WriteEntry("Matrix Monitor", string.Format("Unhandled exception from Frame Dispatcher\r\nMessage: {0}\r\nSource: {1}\r\nInnerException: {2}\r\nStack Trace: {3}\r\nFull String: {4}", e.Exception.Message, e.Exception.Source, e.Exception.InnerException, e.Exception.StackTrace, e.Exception.ToString()));
        e.Handled = true;
    } 


    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        this.Dispatcher.BeginInvoke(DispatcherPriority.Send, new ThreadStart(delegate()
            {
                setUrl();
            }));
    }

    private void setUrl()
    {
        ping = new Ping();
        ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted);
        videoChecks checks = new videoChecks();

        string ipAddressToUse = checks.isIPInternal(_camera.camIP) ? _camera.camIP : _camera.camExtIP;
        ping.SendAsync(ipAddressToUse, 1000, null);
    }

    void ping_PingCompleted(object sender, PingCompletedEventArgs e)
    {
        try
        {
            if (e.Reply.Status == IPStatus.Success)
            {
                if (_successState == null || _successState == false)
                {
                    _successState = true;
                    string uriWithResolution = string.Format("{0}&res={1}x{2}&header=0", _uri, (int)_width, (int)_height);

                    if (Frame1 != null)
                        Frame1.Source = new Uri(uriWithResolution);
                }
            }
            else
            {
                if (_successState == null || _successState == true)
                {
                    _successState = false;
                    Image1.Source = new BitmapImage(new Uri(_noImageUrl));
                }
            }
        }
        catch (ObjectDisposedException ex)
        {
            Dispose();
        }
        finally
        {
            ((IDisposable)sender).Dispose();
        }

    }

    #region IDisposable Members

    public void Dispose()
    {
        if (timer != null)
        {
            timer.Elapsed -= new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Enabled = false;
            timer.Dispose();
            timer = null;
        }

        Frame1.Source = null;

        if (ping != null)
        {
            ping.PingCompleted -= new PingCompletedEventHandler(ping_PingCompleted);
            ((IDisposable)ping).Dispose();
            ping = null;
        }
    }

    #endregion
}

如果您查看堆栈跟踪底部的错误模块,您将看到 msvfw32.dll。这不是 WPF 使用的 DLL,因此我假设它来自您正在加载的网页中的某些 active-x。我更加确信这一点,因为您的代码暗示了处理相机/视频的内容,而 msvfw32 处理视频(它也很旧了!!)。它出现在 Dispatcher 循环中,因为 Dispatcher 还处理 Win32 消息循环,最终由所谓的 activex 使用。

另外,请尝试检查这里有例外 http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.unhandledexception.aspx,也许你可以设置参数 Handled=true

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跟踪 WPF 中的 AccessViolationException 的相关文章

  • 在 WPF 中创建一个漂亮的 GUI

    我需要创建一个桌面 CAD 应用程序 它本质上应该有一个漂亮的现代 GUI 我正在考虑创建一个 WPF 应用程序 以便拥有丰富的用户界面 有人能给我推荐一个设计良好的 WPF 桌面应用程序 GUI 框架吗 我在这个视频中发现了一些很酷的 G
  • WPF 触摸应用程序(部分)在 .NET Framework 4.7 上冻结

    Update 微软承认了这个问题 https connect microsoft com VisualStudio Feedback Details 3139882 Gepost 门 Microsoft op 13 10 2017 om 1
  • 从 TransformedBitmap 对象中“跨越”困境

    我有一个 2208 x 3000 TransformedBitmap 对象 其格式为 Indexed8 我正在对其进行 CopyPixels 操作 我在用着 int formattedBitmap PixelWidth formattedB
  • 为什么多线程访问 WPF UI 控件会产生开销?

    我是否错过了 WPF 以及之前的 Windows 窗体 在开发多线程应用程序时需要编写大量重复代码的一些事情 应用程序中的每个 UI 控件最终都需要额外的代码行来获取和设置每个属性 internal delegate void SetEle
  • 触发 OnPropertyChanged 的​​更好方法

    我们有一个遵循 MVVM 模式的 WPF 项目 在视图模型中有很多代码 如下所示 private string m Fieldname public string Fieldname get return m Fieldname set m
  • DispatcherTimer Stop 不停止

    更新 我把完整的代码放出来供参考 我正在尝试使用 Dispatcher 方法而不是 Forms Timer 我在方法结束时停止了 但在停止之前它一直循环多次 什么地方出了错 顺便说一句 我必须提到我确实在计时器 if 语句中使用了 Mess
  • 如何设置和更改 WPF 中的文化

    我有一个 NET 4 0 WPF 应用程序 用户可以在其中更改语言 文化 我只是让用户选择一种语言 创建相应的 CultureInfo 并设置 Thread CurrentThread CurrentCulture cultureInfo
  • 将 winform 树视图转换为 wpf 树视图

    我已经构建了一个在 winforms 中生成树视图的函数 它包括具有递归的子文件夹和文件 现在我想将其转换为 wpf 我不知道如何处理课程 我知道我必须制作自己的自定义类 treenode 它有一个属性 parent 类似于 winform
  • 破译哪个控件触发了事件

    我有一个包含许多图像的应用程序 这些图像看起来都相同并执行类似的任务
  • 列表框未虚拟化

    我有一个未虚拟化的列表框 我显然错过了一些东西 但找不到它 它实际上是一个列表框内的一个列表框 外部列表框有一个 ItemTemplate 其中包含一个 Expander Expander 用于显示一组项目 Expander 的内容是显示项
  • DataGrid 是 WPF 中的必需品吗?

    我看到很多讨论正在进行 人们询问 WPF 的 DataGrid 并抱怨 Microsoft 迄今为止还没有在其 WPF 框架中提供 DataGrid 我们知道 WPF 是一项出色的 UI 技术 并且具有 ItemsControl DataT
  • WPF 在 .NET Framework 4.0 中的 x64 上启动缓慢

    我注意到 如果我为任何 CPU x64 构建 WPF 应用程序 则与在 x86 上启动 在发布和调试模式下 相比 启动 大约 20 秒 或加载新控件所需的时间要长得多 VS 的内部或外部 即使是最简单的 WPF 应用程序也会出现这种情况 该
  • “该类型不包含任何可访问的构造函数” - 具有无参数构造函数

    我正在尝试加载一个类作为静态资源
  • 访问 ControlTemplate 内的控件

    这是 xaml
  • C# WPF - 应用程序图标 + ShowInTaskbar = False

    我创建了一个具有以下属性的自定义分层 WPF 窗口 允许透明度 True 在任务栏显示 False 背景 透明 最上面 True 图标 图标 ico 我已在 项目属性 gt 应用程序 选项卡下添加了 Icon ico 如果 ShowInTa
  • 我如何在 WPF 中模仿这种行为?

    我对 WPF 和 C 开发相当陌生 我正在制作这个应用程序 我不知道是否有人熟悉 VOIP App Discord 但他们有一个我非常喜欢的特定行为 并且想尝试使用 WPF 创建类似的风格 当您在 Discord 上添加服务器时 单击一个按
  • 如何检查应用程序的另一个实例是否正在运行[重复]

    这个问题在这里已经有答案了 有人可以展示如何检查程序的另一个实例 例如 test exe 是否正在运行 如果是 则停止加载应用程序 如果存在该实例 想要一些严肃的代码吗 这里是 var exists System Diagnostics P
  • CefWebBrowser 不显示

    解决方案 该问题是由于Program cs中未加载CefRuntime造成的 只需将示例文件中的所有代码复制到您的 Program cs 中即可 然后 如果您的 CefWebBrowser 卡住并出现 旋转等待鼠标光标 则设置 Single
  • 当 View 被渲染/实例化时通知 ViewModel

    我有一个自定义用户控件 ChartControl 我在我的 WPF 应用程序中使用 MainApp 我渲染如下
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n

随机推荐