如何异步调用Kernal32.dll中的ReadFile()? C#

时间:2016-02-23 11:10:45

标签: c# c++ .net asynchronous usb

我正在尝试从通过USB端口连接的设备读取数据。

要实现这一点,我使用以下功能,

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool ReadFile
    (
        IntPtr hFile,
        [MarshalAs(UnmanagedType.LPArray)] [Out] byte[] lpBuffer,
        uint nNumberOfBytesToRead,
        out uint lpNumberOfBytesRead,
        [In] ref System.Threading.NativeOverlapped lpOverlapped
    );

然而,这个函数调用阻止了我的UI线程并导致我的UI在执行读取时似乎挂起。

我在MSDN上读到RedFile可以在C++ ReadFile() MSDN中异步运行。我读到了ReadFile()on C# MSDN,它没有解释任何有关异步执行的内容。

我已经尝试添加标准更改以尝试使其Asynchonous但我收到错误,“无法编组'返回值':通用类型无法编组”我相信这是因为我更改了函数调用的返回类型到Task<bool>。 return参数的类型为unmanagedType.Bool

1 个答案:

答案 0 :(得分:0)

要使用ReadFile()执行异步I / O,您需要使用重叠结构。您通常希望在单独的线程上使用异步I / O,然后在I / O完成时唤醒/发送信号。有很多方法可以做到这一点,但在Windows上它通常是通过一个事件完成的。

阅读本文: https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365683(v=vs.85).aspx