0

我在 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 方法返回时处理该问题?

4

1 回答 1

1

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

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

于 2013-09-12T18:15:40.957 回答