2017-02-07 4 views
0

私はいくつかのWPFエディタを書いています。 しかし、テキストストアはStreamです。Streamへの書き込みに非同期コードを使用する方法はありますか?

だから、ここでのXAMLコード:ユーザーは、こののredactorでいくつかのテキストを読み書きすることができますので、

<TextBox Text="{Binding ObjectViewModel.Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" /> 

私は、PropertyChangedUpdateSourceTriggerを設定します。

ここで(ストリーム)としてテキストを読み書きコード:

public String Text 
{ 
    get 
    {  
     var sr = new StreamReader(StreamObject.text, Encoding.UTF8, true); 
     return sr.ReadToEnd(); 
    } 

    set 
    { 
     lock (_lockObject) 
     { 
      var str = value; 
      var textStream = new MemoryStream(); 
      using (var writer = new BinaryWriter(textStream, Encoding.UTF8, true)) 
      {           
       writer.Write(Encoding.UTF8.GetBytes(str)); 
      } 
      textStream.Position = 0; 
      StreamObject.text = null; 
      StreamObject.text = textStream; 
      textStream.Close(); 
     } 
    } 
} 

ので、ユーザタイプの新しい言葉のコード書き込みは、新しいデータをストリーム(クリア古いストリームと新しいを作成)するとき。

しかし、それは遅い性能を得る。 async(何とか)やその他の方法を使ってパーフォマスを改善する必要がありますか?

私は知っている、それはLostFocusプロパティを使用することができますが、その方法でユーザーはTextBoxのフォーカスを失う必要があります。

+0

最初にストリームにテキストを保存する理由は何ですか? – Clemens

+0

@クレメンス、それはDBに格納されています。 By design –

+0

その後、すべてのキーストロークではなく、DBに格納される直前に変換してください。 – Clemens

答えて

1

私は非同期(何らかの形で)または他の方法を使用してパフォーマンスを改善する必要がありますか?

ありReadToEndAsyncと呼ばれるReadToEnd方法のasyncバージョンは確かですが、それは実際にどの速くあなたのコードをすることはありませんし、プロパティをasyncとしてマークすることはできませんので、あなたはプロパティからそれを呼び出すことはできません。

ソースプロパティーのゲッターとプロパティーが変更されるたびに同じセッターに新しいStreamを作成するのは意味がありません。

のように、ビューモデルのコンストラクタまたはコマンドのExecuteメソッドなどでストリームを読み取ってから、stringプロパティの値を設定する必要があります。そして、あなたが例えば、あなたが実際にデータベースに保存する必要があり、時間によってバック一度ストリームからstringを変換:

class ViewModel 
{ 
    public ViewModel() 
    { 
     using (var sr = new StreamReader(StreamObject.text, Encoding.UTF8, true)) 
      Text = sr.ReadToEnd(); 
    } 

    //this method is called when your "Save" button or similar is clicked 
    public void SaveToDb() 
    { 
     lock (_lockObject) 
     { 
      var str = value; 
      using (textStream = new MemoryStream()) 
      { 
       using (var writer = new BinaryWriter(textStream, Encoding.UTF8, true)) 
       { 
        writer.Write(Encoding.UTF8.GetBytes(str)); 
       } 
       textStream.Position = 0; 
       StreamObject.text = null; 
       StreamObject.text = textStream; 
      } 
     } 
    } 

    public String Text 
    { 
     get;set; 
    } 
} 

ソースプロパティ自体ストリームについて何を知っているべきではありません。

+0

ええ、goo戦略に感謝します。私はそれの "読む"部分を使用します。しかし、私のRedactorのSaveボタンは、 'StreamObject.text'が変更されたときにアクティブになります。 –

+0

Textプロパティが変更されたときにアクティブにするように修正する必要があります。 – mm8

関連する問題