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

时间:2016-03-03 06:31:54

标签: c# filestream

在某些地方我打电话

Task.Run(new Action(Read));

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

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

此线程阻塞而Read尝试从文件中获取一些数据(这不是通常的文件,这是设备)。然后我关闭应用程序,表单关闭,但应用程序仍在运行。我在deviceStream上尝试了Close和Dispose但没有帮助 - 它仍然等待Read完成。中心不推荐使用中断线程。

主要目标是不间断地读取数据,但是数据从设备到达,并且片段间的间隔可能很大,因此可以长时间阻止读取。

问题:是否有一些方法可以优雅地中断Read?是否可以实现另一种模式来实现我的目标(可能使用BeginRead / EndRead,但在这里强调EndRead也会阻止并且不能被中断。

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

也许它对你有帮助:

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

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