【问题标题】:Is it good practice to pass a StreamReader to a background worker DoWork method?将 StreamReader 传递给后台工作人员 DoWork 方法是一种好习惯吗?
【发布时间】:2013-09-13 02:15:40
【问题描述】:

我正在 Visual C# 中创建一个 GUI,并且我正在实现一个功能,用户可以打开一个文件并从该文件中读取行。我有从主 GUI 线程中的 OpenFileDialog 创建 StreamReader 的代码,然后将 StreamReader 传递给 BackgroundWorker。

StreamReader streamRdr = new StreamReader(dialog.OpenFile());
worker.RunWorkerAsync(streamRdr);

这是好的做法吗?我将 StreamReader 对象传递给后台线程,因为我不希望 BackgroundWorker 处理 OpenFileDialog 代码。

在 BackgroundWorker DoWork 方法中,我像这样使用 StreamReader

using (StreamReader tempRdr = (StreamReader)e.Argument)
{
    // read from StreamReader...
    return;
}

我的第二个问题是即使 StreamReader 是在主 GUI 线程中创建的,它是否会正确关闭?而且我是否必须明确调用StreamReader.Close()?或者using 语句会在 DoWork 方法返回时处理这个问题?

【问题讨论】:

  • 我必须显式调用StreamReader.Close()?不,using 就足够了。
  • 您使用哪个框架来构建 GUI? Winforms 还是 WPF?
  • 抱歉应该指定,WinForms
  • 练习?嗯。如果您担心,您可以将文件名传递给工作人员并拥有它File.Open(filename)

标签: c# backgroundworker using streamreader


【解决方案1】:

由于无论如何您只是在调用结束时关闭流读取器,我建议将文件名传递给您的 DoWork 方法而不是流读取器。虽然我没有看到您的代码有任何明显的问题,但从同一个线程(如果可能的话,最好从同一个函数)打开和关闭事物通常是“好习惯”。由于文件名只是一个字符串,因此您完全不必担心多线程访问。

请注意有用的方法System.IO.File.ReadAllBytesReadAllTextReadAllLines,如果您将文件名传递给DoWork 方法,它们可能会让您的生活更轻松。

【讨论】:

  • 感谢您的建议,我不知道为什么我如此热衷于使用 StreamReader。将所有行读入一个数组然后处理它们对我的应用程序来说更方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多