我正在尝试从通过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
。
答案 0 :(得分:0)
要使用ReadFile()执行异步I / O,您需要使用重叠结构。您通常希望在单独的线程上使用异步I / O,然后在I / O完成时唤醒/发送信号。有很多方法可以做到这一点,但在Windows上它通常是通过一个事件完成的。
阅读本文: https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365683(v=vs.85).aspx