首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使在手术成功完成后,Overlapped.AsyncResult也不会改变

即使在手术成功完成后,Overlapped.AsyncResult也不会改变
EN

Stack Overflow用户
提问于 2020-08-08 08:10:06
回答 1查看 135关注 0票数 0

为了与HID设备通信,我使用了来自kernel32的一些功能。代码是从微芯片MLA定制的HID设备项目中借来的。它使用阻塞方法。

我发现我可以使这些方法异步。下面是我尝试过的异步编写:

代码语言:javascript
复制
//...

internal const uint FILE_FLAG_OVERLAPPED = 0x40000000;
//...

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern bool ReadFile(
    SafeFileHandle hFile,
    IntPtr lpBuffer,
    uint nNumberOfBytesToRead,
    ref uint lpNumberOfBytesRead,
    Overlapped lpOverlapped);        // Formerly: IntPtr lpOverlapped);
//...

WriteHandleToUSBDevice = CreateFile(DevicePath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero,
    OPEN_EXISTING, FILE_FLAG_OVERLAPPED, IntPtr.Zero);    // Formerly: 0 instead of FILE_FLAG_OVERLAPPED
//...

Overlapped OL = new Overlapped();
WriteFile(WriteHandleToUSBDevice, OUTBuffer, 65, ref BytesWritten, OL);    // Formerly: IntPtr.Zero instead of OL
//Some code to run while write operation is in progress asynchronously...
while (OL.AsyncResult == null) ;    // Wait until write is completed; waits forever.

您可以在微芯片MLA定制HID设备项目中找到完整的代码。

OL.AsyncResult仍然是空的,尽管写已经成功完成;我确信,因为设备正确地接收数据和响应。我的代码有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-08 11:48:02

感谢Gserg的评论,我找到了一个比使用kernel32 C++样式函数更好的解决方案:

代码语言:javascript
复制
SafeFileHandle HandleToUSBDevice = CreateFile(DevicePath, GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,
        IntPtr.Zero);

FileStream HID = new FileStream(HandleToUSBDevice, FileAccess.ReadWrite, (int)(PacketSize + 1), true);


Task WriteTask = Task.Factory.StartNew(() => HID.Write(OUTBuffer, 0, 65));
//Some Code
if (!WriteTask.Wait(2500)) throw new TimeoutException("Failed to send data within 2.5s timeout.");

如果您的async/await框架目标超过4.5,则可以使用.Net和WriteAsync

我可以使用ReadFile而不是HID.Write,但是关闭句柄会更困难。此外,使用托管C#方法比导入和使用非托管C++函数更好。

编辑:我还为BeginRead添加了代码:

代码语言:javascript
复制
IAsyncResult result = HID.BeginRead(INBuffer, 0, 65, null, null);
while (FavoriteCondition)
{
    MethodWhichShouldBeCalledRepeatedly();
    if (result.IsCompleted)
    {
        ProcessData(INBuffer);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63313159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档