使用FileStream.Read正确关闭应用程序

本文关键字:应用程序 FileStream Read 使用 | 更新日期: 2023-09-27 18:37:12

在我打电话的某个地方

Task.Run(new Action(Read));

此调用在其他线程中启动任务:

private void Read()
{
    while (!cancelToken.IsCancellationRequested)
    {
        int bytesReaded = deviceStream.Read(buffer, 0, bufferSize);
    }
}

此线程在读取时阻塞尝试从文件中获取一些数据(这不是通常的文件,这是设备)。 然后我关闭应用程序,表单关闭,但应用程序仍在运行。我尝试在设备流上关闭并处理,但没有帮助 - 它仍在等待读取完成。Microsoft不建议中断线程。

主要目标是不间断地读取数据,但数据从设备中逐个到达,并且片段之间的暂停可能很大,因此读取可能会被长时间阻止。

问题:有没有办法优雅地中断读取?有没有另一种模式可以实现我的目标(也许使用 BeginRead/EndRead,但在这里读到 EndRead 也会阻止并且不能中断。

PS:我在MSDN ReadAsync中看到新方法,但无法想象如何使用它(我需要重新启动读取)

使用FileStream.Read正确关闭应用程序

如果设备流提供 ReadTimeout 属性,则可以使用它:

https://msdn.microsoft.com/en-us/library/system.io.stream.readtimeout%28v=vs.110%29.aspx

这不是FileStream.Read问题,我使用KeWait阻止了驱动程序中的ReadDispatcher...功能。

也许这对你有帮助:

private void Read()
{
    while (!cancelToken.IsCancellationRequested)
    {
        if(deviceStream.CanRead && deviceStream.Length > 0)
            int bytesReaded = deviceStream.Read(buffer, 0, Math.Min(bufferSize, deviceStream.Length));
    }
}

当然,当您处理时,您需要呼叫取消请求