0

我有一个带有按钮和文本框的表单 Form1。当我单击按钮时,我应该从 USB 设备获取一些数据。出于某种原因,它只有大约 2% 正常工作(我能够在 100 次点击中得到 2 个正确响应)。这是Form1的代码:

namespace Test_onForm1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Lib1.FindHID.TransferInputAndOutputReports(0xC0); //request specific data from USB device
        }
    }
}

处理 USB 通信的代码位于 DLL Lib1 中(以下代码片段):

namespace Lib1
{      
    public static class FindHID
    {
    private static void TransferInputAndOutputReports(UInt16 repType)
    {
        //some code here sending request to USB device... and then read what came from USB
        ReadInput();
        //some code here                
    }    

    //  Read an Input report.
        private static void ReadInput()
       {
           Byte[] inputReportBuffer = null;
           inputReportBuffer = new Byte[MyHid.Capabilities.InputReportByteLength];
         IAsyncResult ar = null;

          if (fileStreamDeviceData.CanRead)
         {
        // RUNS UP TO THIS POINT and then Form1 freezes most of the time
              fileStreamDeviceData.BeginRead(inputReportBuffer, 0, inputReportBuffer.Length, new AsyncCallback(GetInputReportData), inputReportBuffer);                 
           }
       }

    private static void GetInputReportData(IAsyncResult ar) 
      {
        // RARELY GETS HERE
                Byte[] inputReportBuffer = null;
                inputReportBuffer = (byte[])ar.AsyncState;              

   fileStremDeviceData.EndRead(ar); //waits for read to complete
        // then code to update Form1 
     }      
    }
 }
}

当它不起作用时,它会在 fileStreamDeviceData.BeginRead 周围停止,然后 Form1 冻结。

为了进行测试,我创建了一个全新的项目,而不是使用 DLL,而是将所有 DLL 代码复制到 Form1。此选项在 100% 的时间里都可以正常工作。所以我的问题是为什么它不适用于 DLL?

更新:当我很幸运并且它开始工作时,它会无限期地工作,直到我关闭应用程序。然后,我必须继续努力让它再次工作。如何解决此问题?

4

2 回答 2

0

解决了!

在 Microsoft 网站上找到:“BeginRead 在流上的默认实现同步调用 Read 方法,这意味着 Read 可能会阻塞某些流。”

我在 Visual Studio 2010 上使用 .NET Framework 4.0。决定更新到具有Stream.ReadAsync方法的 .NET Framework 4.5。但是,我无法Stream.ReadAsync在 Visual Studio 2010 上实现(不知道原因,可能需要更新到 2012 年?)。因此,使用更新的 Framework 4.5,我尝试了我的代码,它每次都可以正常工作。

于 2013-05-06T01:16:57.623 回答
0

最有可能的问题是其中的代码EndRead正在尝试更新表单,但它不在 UI 线程上。您必须与 UI 线程同步,通过执行Form.Invoke或以某种方式通知表单数据已准备好,以便 UI 线程可以进行更新。

于 2013-05-05T17:03:16.237 回答