【问题标题】:Windows Mobile application with symbol scanner dll crash at close application带有符号扫描仪 dll 的 Windows Mobile 应用程序在关闭应用程序时崩溃
【发布时间】:2013-12-04 10:31:54
【问题描述】:

我有一个问题,我想不出解决方案。它是关于我在 wm 6.5 和 Compact Framework 2.0 上的摩托罗拉 MC3190-G 手持应用程序上的应用程序

在应用程序中使用扫描仪触发器实现符号包后,每次关闭应用程序/或启用了扫描仪的表单时都会收到以下错误: (即使我从未收到扫描数据)

我在 stackoverflow 和其他网站上搜索了解决方案,但没有解决方案。

我是移动应用程序开发的新手。我尝试捕获所有内容,但异常类型“异常”似乎无法捕获错误。

对不起英语不好。

错误:

NullReferenceException

在 MainForm.SymbolReader_ReadNotifiy()

Task.Invoke()

System.Windows.Forms.Control._InvokeAll()

System.Windows.Forms.Control.WinProc()

信息:

摩托罗拉 EMDK 2.6 设备:MC3190-G

源码:

扫描仪.cs

namespace MyScann
{
    /// <summary>
    /// Summary description for Scanner.
    /// </summary>
    public class Scanner
    {

        public static Symbol.Barcode.Reader SymbolReader = null;
        public static Symbol.Barcode.ReaderData SymbolReaderData = null;
        public static System.EventHandler SymbolEventHandler = null;
        public static DataSet CodeDataSet;


        //public static Utils.Sound ReadErrorSound;

        public static bool ScannerEnabled = false;
        public static void ActivateScanner()
        {

            // If we have both a reader and a reader-data Object
            if ( Scanner.SymbolReader != null &&
                Scanner.SymbolReaderData != null &&
                ! Scanner.SymbolReaderData.IsPending )
            {
                // Submit 'Read'
                try
                {
                    Scanner.SymbolReader.Actions.Read(Scanner.SymbolReaderData);
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message);
                    if ( err.InnerException != null )
                        MessageBox.Show(err.InnerException.Message);
                }
            }

        }
        public static void DeactivateScanner()
        {

            // If we have both a reader and a reader-data Object
            if ( Scanner.SymbolReader != null &&
                Scanner.SymbolReaderData != null &&
                Scanner.SymbolReaderData.IsPending )
            {
                // Submit 'CancelRead'
                try
                {
                    Scanner.SymbolReader.Actions.CancelRead(Scanner.SymbolReaderData);
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message);
                    if ( err.InnerException != null )
                        MessageBox.Show(err.InnerException.Message);
                }
            }

        }

        /// <summary>
        /// Initialize the reader.
        /// </summary>
        /// <returns>False if an error accurs</returns>
        public static bool InitSymbolReader()
        {

            // If reader is already present then fail initialize
            if ( SymbolReader != null )
            {
                return false;

            }

            // Create new reader, first available reader will be used.
            SymbolReader = new Symbol.Barcode.Reader();
            // Create reader data
            SymbolReaderData = new Symbol.Barcode.ReaderData(
                Symbol.Barcode.ReaderDataTypes.Text,
                Symbol.Barcode.ReaderDataLengths.DefaultText);

            // set scanner read error sound
            //ReadErrorSound = new Utils.Sound(ErrorSound);

            return true;
        }

        /// <summary>
        /// Stop reading and disable/close reader
        /// </summary>
        public static void DeinitSymbolReader()
        {
            try
            {
                // If we have a reader
                if ( SymbolReader != null )
                {

                    //Cancel Incoming Requests
                    SymbolReader.Actions.Flush();

                    // Disable the reader
                    SymbolReader.Actions.Disable();

                    // Free it up
                    SymbolReader.Dispose();

                    // Indicate we no longer have one
                    SymbolReader = null;
                }

                // If we have a reader data
                if ( SymbolReaderData != null )
                {
                    // Free it up
                    SymbolReaderData.Dispose();

                    // Indicate we no longer have one
                    SymbolReaderData = null;
                }
                if(SymbolEventHandler!=null){
                    //SymbolEventHandler(this,null);
                    SymbolEventHandler = null;
                }
            }
            catch (Exception e){MessageBox.Show(e.StackTrace.ToString());
            }

        }

        /// <summary>
        /// Enable most barcode type with no limitation on length
        /// </summary>
        public static void OpenAllBarcodes()
        {
            SymbolReader.Decoders.CODABAR.Enabled = true;
            SymbolReader.Decoders.CODABAR.MinimumLength = 0;
            SymbolReader.Decoders.CODABAR.MaximumLength = 0;

            SymbolReader.Decoders.CODE11.Enabled = true;
            SymbolReader.Decoders.CODE11.MinimumLength = 0;
            SymbolReader.Decoders.CODE11.MaximumLength = 0;

            SymbolReader.Decoders.CODE39.Enabled = true;
            SymbolReader.Decoders.CODE39.MinimumLength = 0;
            SymbolReader.Decoders.CODE39.MaximumLength = 0;

            SymbolReader.Decoders.CODE93.Enabled = true;
            SymbolReader.Decoders.CODE93.MinimumLength = 0;
            SymbolReader.Decoders.CODE93.MaximumLength = 0;

            SymbolReader.Decoders.CODE128.Enabled = true;
            SymbolReader.Decoders.CODE128.MinimumLength = 0;
            SymbolReader.Decoders.CODE128.MaximumLength = 0;

            SymbolReader.Decoders.DATAMATRIX.Enabled = true;
            SymbolReader.Decoders.DATAMATRIX.MinimumLength = 0;
            SymbolReader.Decoders.DATAMATRIX.MaximumLength = 0;

            SymbolReader.Decoders.D2OF5.Enabled = true;
            SymbolReader.Decoders.D2OF5.MinimumLength = 0;
            SymbolReader.Decoders.D2OF5.MaximumLength = 0;

            SymbolReader.Decoders.I2OF5.Enabled = true;
            SymbolReader.Decoders.I2OF5.MinimumLength = 0;
            SymbolReader.Decoders.I2OF5.MaximumLength = 0;
            /*
        SymbolReader.Decoders.EAN13.Enabled = true;
        SymbolReader.Decoders.EAN13.MinimumLength = 0;
        SymbolReader.Decoders.EAN13.MaximumLength = 0;

        SymbolReader.Decoders.EAN8.Enabled = true;
        SymbolReader.Decoders.EAN8.MinimumLength = 0;
        SymbolReader.Decoders.EAN8.MaximumLength = 0;

        SymbolReader.Decoders.PDF417.Enabled = true;
        SymbolReader.Decoders.PDF417.MinimumLength = 0;
        SymbolReader.Decoders.PDF417.MaximumLength = 0;

        SymbolReader.Decoders.UPCA.Enabled = true;
        SymbolReader.Decoders.UPCA.MinimumLength = 0;
        SymbolReader.Decoders.UPCA.MaximumLength = 0;

        SymbolReader.Decoders.UPCE1.Enabled = true;
        SymbolReader.Decoders.UPCE1.MinimumLength = 0;
        SymbolReader.Decoders.UPCE1.MaximumLength =0;

        SymbolReader.Decoders.UPCE0.Enabled = true;
        SymbolReader.Decoders.UPCE0.MinimumLength = 0;
        SymbolReader.Decoders.UPCE0.MaximumLength = 0;
             */




            SymbolReader.Parameters.CodeIdType = Symbol.Barcode.CodeIdTypes.None;
            SymbolReader.Parameters.ScanType = Symbol.Barcode.ScanTypes.Background;
            SymbolReader.Parameters.LocalFeedback = Symbol.Barcode.DisabledEnabled.Enabled;

            Scanner.SymbolReader.Parameters.Feedback.Success.BeepTime = 0;
        }







    }
}
}

MainForm.cs 内

    public void InitScanner(byte BatteryLevel)
    {

        // Create event handler delegate
        if (Scanner.MyScann.Scanner.SymbolEventHandler == null)
        {
            Scanner.MyScann.Scanner.SymbolEventHandler = new EventHandler(this.SymbolReader_ReadNotify);
            // Enable reader, with wait cursor
            Scanner.MyScann.Scanner.SymbolReader.Actions.Enable();
            Scanner.MyScann.Scanner.OpenAllBarcodes();
            Scanner.MyScann.Scanner.ScannerEnabled = true;
        }
        // If we have both a reader and a reader data
        if ((Scanner.MyScann.Scanner.SymbolReader != null) &&
            (Scanner.MyScann.Scanner.SymbolReaderData != null))
        {
            // Submit a read
            Scanner.MyScann.Scanner.SymbolReader.ReadNotify += Scanner.MyScann.Scanner.SymbolEventHandler;
            Scanner.MyScann.Scanner.SymbolReader.Actions.Read(Scanner.MyScann.Scanner.SymbolReaderData);
        }
    }

    public void SymbolReader_ReadNotify(object sender, EventArgs e)
    {
        Symbol.Barcode.ReaderData TheReaderData = Scanner.MyScann.Scanner.SymbolReader.GetNextReaderData();
        if (TheReaderData.Result == Symbol.Results.SUCCESS /*&& (txtBarcode.Focused == true)*/)
        {

            //  if (txtBarcode.Focused == true)
            //  {
            //       txtBarcode.Text = TheReaderData.Text.ToString();
            MessageBox.Show(TheReaderData.Text.ToString());
            SymbolReader_CycleScannerReader();
            return;
            //   }
        }
        SymbolReader_CycleScannerReader();
    }

    public void SymbolReader_CycleScannerReader()
    {
        Scanner.MyScann.Scanner.SymbolReader.Actions.Read(Scanner.MyScann.Scanner.SymbolReaderData);
    }

    public void StartScanner()
    {
        bool flag = false;
        try
        {
            Scanner.MyScann.Scanner.SymbolEventHandler = null;
            Scanner.MyScann.Scanner.DeinitSymbolReader();
            Scanner.MyScann.Scanner.ScannerEnabled = false;
            if (!Scanner.MyScann.Scanner.ScannerEnabled)
            {
                Scanner.MyScann.Scanner.SymbolEventHandler = null;
                Scanner.MyScann.Scanner.InitSymbolReader();
                InitScanner(100);
                flag = true;
            }
        }
        catch
        {
            Scanner.MyScann.Scanner.SymbolEventHandler = null;
            Scanner.MyScann.Scanner.InitSymbolReader();
            InitScanner(100);
            flag = true;
        }
        finally
        {
            if (!flag)
            {
                MessageBox.Show("Scanner Error");
            }
        }
    }

    void public void CloseScanner()
    {
        Scanner.MyScann.Scanner.SymbolEventHandler = null;
        Scanner.MyScann.Scanner.DeinitSymbolReader();
    }

void MainFormLoad(object sender, EventArgs e)
    {
        StartScanner();
    }
void MainFormClosing(object sender, System.ComponentModel.CancelEventArgs e)
    {
            CloseScanner();
    }
    void ButtonExitClick(object sender, EventArgs e)
    {
        Scanner.MyScann.Scanner.DeinitSymbolReader();
        this.Close();
        Application.Exit();
    }

任何帮助将不胜感激!

【问题讨论】:

    标签: c# barcode-scanner motorola-emdk compact-framework2.0


    【解决方案1】:

    我不熟悉符号库,但据我所知,问题是在扫描仪“取消初始化”之后的某个时间点引发了 ReadNotify 事件。

    您应该在 MainForm.CloseScanner() void 中做的是首先删除 MainForm.InitScanner() 中添加的所有句柄,然后调用 Scanner .DeinitSymbolReader().

    编辑: 您应该使用 -= 运算符删除句柄,而不是分配空引用。

    希望这会有所帮助。

    【讨论】:

    • 谢谢,这以某种方式解决了问题。我编写了一个从符号事件处理程序中删除事件的方法。非常感谢
    【解决方案2】:

    尝试在退出时不调用“DeinitSymbolReader”,看看是否能解决问题

    皮特

    【讨论】:

    • 感谢您的回复,皮特。这将解决错误本身,但如果我不调用“deinitSymbolReader”,则应用程序不会正确退出。它会卡在任务管理器中。
    【解决方案3】:

    我的印象是,无论是否使用“deinitSymbolReader”,您的应用程序都无法正确退出。通过在已关闭的资源上调用 deinitSymbolReader 可能会导致访问冲突。 也许您应该尝试放弃 deinintSymbolReader,并尝试在 Form 的 Disposing Event 中也 Dispose 扫描器/触发器。

    问题似乎是您正在处理复杂的数据结构,并且您将它们更改为 null 这基本上意味着您正在更改引用并可能确保 GC 永远不会释放所有非托管资源。

    您正在处理对非托管资源的不当操作的一个迹象是,第二个 deinintSymbolReader 不应该做任何事情(因为您的所有资源都是空的)更不会导致错误。

    我有一个使用触发器和扫描器的应用程序,如果扫描器不为空,它只需要一个“enableScanner = false”和一个“Scanner.Dispose()”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 2016-05-30
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多