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();
}

これは、ファイルから一度に30バイトのデータを読み取るための私のC#コードです。useAsync=trueを持つFileStreamコンストラクターを使用してStreamを作成しました。ここでは、stream.Readメソッドが使用されます。

  1. この読み取り操作はASYNCHRNOUSモードで機能していますか?

  2. これを確認する方法は?

  3. もう1つの問題は、Encoding.UTF8.GetString(Buffer);空白を「□」文字として指定することです... y?

  4. 1秒の遅延を作る以外の方法はありますThread.Sleep(1000);か?

4

2 に答える 2

1

そのようにファイルを読むと、何も解決せずに多くの問題を引き起こしているようです。一度に 30 バイトを読み取り、結果をデコードするポイントがわかりません。最後の文字を間違ってデコードしてしまう可能性があります。

次のようなことをお勧めします。

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

しかし、進行状況コールバックを使用して行を UI に送信する BackgroundWorker の方がはるかに使いやすいかもしれません。

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 に答える
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 に答える