2016-04-02 36 views
1

私は同時に、ユーザーが入力したテキストを表示し、同じユーザー入力データのテキストファイルに書き込むプログラムを作成しようとしています。私はTask.Runとコードラップしようとしました:C#でファイルに書き込む方法

private void button_Click(object sender, RoutedEventArgs e) 
     { 
      show.Text = inputText.Text; 
      //Debug.WriteLine(check1_cont.ToString()); 
      //Debug.WriteLine(check2_cont.ToString()); 

      if (check1_cont && check2_cont == true) 
      { 
       show2.Text = inputText.Text; 

       Task.Run(() => File.WriteAllText(@"A:\temp\name.txt", inputText.Text)); 
      } 

     } 

をしかし、私はボタンを押したとき、私は2番目のテキスト(if文では1)の後に、例外エラーが表示されます。

An exception of type 'System.Exception' occurred in normieap.exe but 
was not handled in user code 

Additional information: The application called an interface that was 
marshalled for a different thread. (Exception from HRESULT: 0x8001010E 
(RPC_E_WRONG_THREAD)) 

私はのStreamWriterを使用してみてください:

private void button_Click(object sender, RoutedEventArgs e) 
     { 
      show.Text = inputText.Text; 
      //Debug.WriteLine(check1_cont.ToString()); 
      //Debug.WriteLine(check2_cont.ToString()); 

      if (check1_cont && check2_cont == true) 
      { 
       show2.Text = inputText.Text; 
       using (StreamWriter writer = new StreamWriter(@"A:\temp\name.txt")) 
       { 
        writer.WriteLine(inputText.Text); 
       } 
      } 

     } 

しかし、私はライン上のエラーを取得:

using (StreamWriter writer = new StreamWriter(@"A:\temp\name.txt")) 

'文字列'から 'System.IO.Stream'に '@ "A:\ temp \ name.txt"'を変換できません

通常の方法でラッパーを使用しない場合は、エラー。この問題に対する解決策は非常に高く評価されます。

+0

問題を示すMCVE(http://stackoverflow.com/help/mcve)を提供してください。あなたの例は、( 'show.Text'や' show2.Text'のような)関連性のない情報を導入し、コードのどこかでは使われません。あなたは、手元にある問題に無意味である他のすべての混乱がなければ、あなたがしようとしていることの明確な例を提供する必要があります。 –

+0

ドライブAとBは、ドライブを最初に交換する必要があるフロッピーディスクに使用されます。 –

+0

ドライブAをセカンダリハードディスクに割り当てました。 – Yetoo

答えて

1

タスクを非同期で実行すると、UIスレッドでの実行が保証されません。あなたの最初の例を試してみてください:

private void button_Click(object sender, RoutedEventArgs e) 
    { 
     show.Text = inputText.Text; 
     //Debug.WriteLine(check1_cont.ToString()); 
     //Debug.WriteLine(check2_cont.ToString()); 

     if (check1_cont && check2_cont == true) 
     { 
      show2.Text = inputText.Text; 
      // Copy the text to output 
      string outputToWrite = inputText.Text; 
      // use the copied text 
      Task.Run(() => File.WriteAllText(@"A:\temp\name.txt", outputToWrite)); 
     } 

    } 

ここでは、バックグラウンドスレッドがGUI要素にアクセスしようとしています。これは一般にWindows Formsなどのスレッド化されたUIライブラリでは許可されていないため、バックグラウンドスレッドに返す前にデータをコントロールからコピーする必要があります。

+0

問題が発生しました。name.txtを作成するコードを実行すると、エラーが発生します。パス 'c:\ users \ username \ documents \ visual studio 2015 \ Projects \ normieap \ normieap \ normieap \ bin \ x86 \ Debug \ AppX \ name.txt 'が拒否されました。私はこれをどのように修正すべきですか? – Yetoo

+0

エラーを提供する必要があります。それが完全に異なっているなら、別の質問を書くかもしれません。 – yumaikas

関連する問題