使用 FileStream.Read 正确关闭应用程序
Proper closing application with FileStream.Read
有些地方我叫
Task.Run(new Action(Read));
此调用在其他线程中启动任务:
private void Read()
{
while (!cancelToken.IsCancellationRequested)
{
int bytesReaded = deviceStream.Read(buffer, 0, bufferSize);
}
}
此线程在 Read 尝试从文件中获取一些数据时阻塞(这不是普通文件,这是设备)。然后我关闭应用程序,关闭表单,但应用程序仍在运行。我在 deviceStream 上尝试了 Close 和 Dispose 但没有帮助 - 它仍在等待读取完成。 Microsoft 不推荐中断线程。
主要目标是不停地读取数据,但是数据是一个个从设备到达的,各个部分之间的停顿会很大,所以Read会阻塞很长时间。
问题:有什么方法可以优雅地中断读取吗?是否可以实施另一种模式来实现我的目标(可能 BeginRead/EndRead,但在这里读到 EndRead 也会阻塞并且不能被中断。
PS:我在 MSDN ReadAsync 中看到了新方法,但无法想象如何使用它(需要重新启动 Read)
如果设备流提供 ReadTimeout,您可以 属性:
https://msdn.microsoft.com/en-us/library/system.io.stream.readtimeout%28v=vs.110%29.aspx
也许对您有帮助:
private void Read()
{
while (!cancelToken.IsCancellationRequested)
{
if(deviceStream.CanRead && deviceStream.Length > 0)
int bytesReaded = deviceStream.Read(buffer, 0, Math.Min(bufferSize, deviceStream.Length));
}
}
当然当你处理你需要调用取消请求
这不是 FileStream.Read 问题,我使用 KeWait... 函数在驱动程序中阻止了 ReadDispatcher。
有些地方我叫
Task.Run(new Action(Read));
此调用在其他线程中启动任务:
private void Read()
{
while (!cancelToken.IsCancellationRequested)
{
int bytesReaded = deviceStream.Read(buffer, 0, bufferSize);
}
}
此线程在 Read 尝试从文件中获取一些数据时阻塞(这不是普通文件,这是设备)。然后我关闭应用程序,关闭表单,但应用程序仍在运行。我在 deviceStream 上尝试了 Close 和 Dispose 但没有帮助 - 它仍在等待读取完成。 Microsoft 不推荐中断线程。
主要目标是不停地读取数据,但是数据是一个个从设备到达的,各个部分之间的停顿会很大,所以Read会阻塞很长时间。
问题:有什么方法可以优雅地中断读取吗?是否可以实施另一种模式来实现我的目标(可能 BeginRead/EndRead,但在这里读到 EndRead 也会阻塞并且不能被中断。
PS:我在 MSDN ReadAsync 中看到了新方法,但无法想象如何使用它(需要重新启动 Read)
如果设备流提供 ReadTimeout,您可以 属性:
https://msdn.microsoft.com/en-us/library/system.io.stream.readtimeout%28v=vs.110%29.aspx
也许对您有帮助:
private void Read()
{
while (!cancelToken.IsCancellationRequested)
{
if(deviceStream.CanRead && deviceStream.Length > 0)
int bytesReaded = deviceStream.Read(buffer, 0, Math.Min(bufferSize, deviceStream.Length));
}
}
当然当你处理你需要调用取消请求
这不是 FileStream.Read 问题,我使用 KeWait... 函数在驱动程序中阻止了 ReadDispatcher。