0
public void fileReader()
{
Stream stream = new FileStream(filename, FileMode.Open , FileAccess.Read , FileShare.None, 30, true);
byte[] Buffer = new byte[30];
while (stream.Read(Buffer, 0, 30) > 0)
{ 
 label1.text=Encoding.UTF8.GetString(Buffer); 
 Thread.Sleep(1000);
}
stream.Dispose();
}

这是我的 C# 代码,每次从文件中读取 30 字节的数据。我已经使用具有 useAsync=true 的 FileStream 构造函数创建了 Stream。这里使用了 stream.Read 方法。

  1. 此读取操作是否在 ASYNCHRNOUS 模式下工作?

  2. 如何检查这个?

  3. 另一个问题是Encoding.UTF8.GetString(Buffer);将空格作为“□”字符... y?

  4. 除了 1 秒延迟,还有其他方法Thread.Sleep(1000);吗?

4

2 回答 2

1

不是因为您使用的是同步Read方法

如果您希望异步阅读它,则必须使用该BeginRead方法

下面是一个来自MSDN的 BeginRead 用法示例

private void ReadStreamAsyncImpl(Stream stream)
    {
        chunk = new byte[chunkSize];
        stream.BeginRead(chunk, 
                         0, 
                         chunkSize, 
                         new AsyncCallback(BeginReadCallback), 
                         stream);
    }

    private void BeginReadCallback(IAsyncResult ar)
    {
        Stream stream = ar.AsyncState as Stream;
        int bytesRead = stream.EndRead(ar);
        StreamContentsAsString += StreamEncoding.GetString(chunk, 0, bytesRead);

        if (bytesRead < chunkSize) {
            // Finished
            isOperationInProgress = false;
            stream.Close();
            if (null != ReadStreamCompleted) {
                ReadStreamCompleted(this, new EventArgs());
            }
        } else {
            ReadStreamAsyncImpl(stream);
        }
    }

也就是说,您可能应该使用 StreamReader 来读取流的字符,而不是自己转换它们。

如果您使用的是 .NET 4.5,您可以使用 ReadAsync 如下(再次来自[MSDN][2]

private async void Button_Click(object sender, RoutedEventArgs e) { UnicodeEncoding uniencoding = new UnicodeEncoding(); 字符串文件名 = @"c:\Users\exampleuser\Documents\userinputlog.txt"; 字节[] 结果;

        using (FileStream SourceStream = File.Open(filename, FileMode.Open))
        {
            result = new byte[SourceStream.Length];
            await SourceStream.ReadAsync(result, 0, (int)SourceStream.Length);
        }

        UserInput.Text = uniencoding.GetString(result);
    }
于 2012-10-15T18:39:00.723 回答
1

像这样阅读您的文件似乎会给您带来很多问题而没有解决任何问题。我看不到一次读取 30 个字节然后解码结果的意义。您最终可能会错误地解码最后一个字符。

我建议您执行以下操作:

using(StreamReader reader = new StreamReader(filename, Encoding.UTF8))
{
    while(!reader.EndOfStream)
    {
        String result = await reader.ReadLineAsync();
        label1.Text = result;
    }
}

但也许 BackgroundWorker 更容易使用,使用进度回调将行发送到 UI。

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    using(StreamReader reader = new StreamReader(e.Argument as String, Encoding.UTF8))
    {
        while(!reader.EndOfStream)
        {
            String line = reader.ReadLine();
            backgroundWorker.ReportProgress(0, line);
            Thread.Sleep(1000);
            if (backgroundWorker.CancellationPending) 
                return;
        }
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    label1.Text = e.UserState as String;
}
于 2012-10-15T19:04:51.410 回答