如何模拟异步文件流

时间:2014-11-20 10:19:21

标签: c# multithreading asynchronous filestream

我正在制作一个程序,并且在我的图形显示中出现了一些问题。

要解决显示故障,我试图模拟文件流输出,而不是将实际控制器连接到电脑并推送随机数。我在努力模仿异步文件流而不会破坏应用程序的流程。

if (fileStreamDeviceData.CanRead)
{
    try
    {
        readTrigger = true;
        while (readTrigger)
        {
            await fileStreamDeviceData.ReadAsync(outputReportBuffer, 0, 
                outputReportBuffer.Length);

            msgQue.Enqueue(outputReportBuffer);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

这部分是我需要改变的部分。它是异步方法的一部分,这部分从文件流对象中获取outputReportBuffer并将其添加到que中。

这是我基本需要重现的东西。这是我改变和尝试的东西,但这是冻结线程。所以我假设我必须创建一个新的线程来创建随机数或者是否有更简单的方法?

Random rdm = new Random();
readTrigger = true;
while (readTrigger)
{
      await fileStreamDeviceData.ReadAsync(outputReportBuffer, 0, 
          outputReportBuffer.Length);

      for (int a = 0; a < outputReportBuffer.Length; a++)
      {
           outputReportBuffer[a] = (Byte)rdm.Next(0, 255);
      }

      msgQue.Enqueue(outputReportBuffer);
}

我环顾四周,并没有找到有效模拟异步文件流的可靠解决方案。 任何指针或建议都将非常感激。

2 个答案:

答案 0 :(得分:0)

当从GUI线程使用await时,await之后的方法的其余部分也在GUI线程上执行。如果价格昂贵,您的显示器可能会无响应。您可以使用ConfigureAwait(false)请求在线程池上执行该方法的其余部分,这可能有助于您的应用。

await fileStreamDeviceData.ReadAsync(outputReportBuffer, 0, 
      outputReportBuffer.Length).ConfigureAwait(false);

最好的办法可能是使用分析器来查看瓶颈所在。

答案 1 :(得分:0)

缓冲区真的足够长,在填充时会造成很多延迟吗?如果是,请使用await Task.Run在线程池上运行该方法的这一部分。

我建议不要使用ConfigureAwait移动到线程池。在UI线程上运行什么以及池上的内容变得不明显,因为相同的代码现在在UI线程上运行一次,并且在线程池的后续迭代中运行一次。混乱。