2016-04-02 61 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)); 
      } 

     } 

但我的第二个文本(一个if语句)后得到一个异常错误,当我按下按钮:

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")) 

因为'@“A:\ temp \ name.txt''不能从'字符串'转换为'System.IO.Stream'

而当我尝试没有任何包装的普通方式时,我得到一个同步错误。任何解决这个问题的方法都将非常感激。

+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窗体这样的单线程UI库中被允许,因此您需要在将数据发送回后台线程之前将数据复制出来,否则代码将失败,如您所见。

+0

我遇到了一个问题,当创建name.txt的代码执行时,出现错误:访问路径'c:\ users \ username \ documents \ visual studio 2015 \ Projects \ normieap \ normieap \ bin \ x86 \ Debug \ AppX \ name.txt'被拒绝。我应该如何解决这个问题? – Yetoo

+0

你将需要提供错误。如果完全不同,那么你可能会写另一个问题。 – yumaikas