将StreamReader传递给后台工作者DoWork方法是一种好习惯吗?

时间:2013-09-12 18:05:09

标签: c# backgroundworker using streamreader

我正在使用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方法返回时处理它吗?

1 个答案:

答案 0 :(得分:1)

由于您只是在通话结束时关闭了流式读取器,我建议将文件名传递给您的DoWork方法而不是流式读取器。虽然我没有看到你的代码有任何明显的问题,但通常是“良好实践”来打开和关闭来自同一个线程的东西(如果可能的话,最好是来自相同的函数)。由于文件名只是一个字符串,因此您不必担心多线程访问。

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