C# 任务。使用异步方法错误运行

C# 任务。使用异步方法错误运行,c#,multithreading,task,C#,Multithreading,Task,我有这样的按钮点击方法 private async void button1_Click(object sender, EventArgs e) { Task<string> st1 = Task.Run(() => ReadFromFile()); textBox1.AppendText("sdsadsa"); textBox1.Text = st1.Result; } private async

我有这样的按钮点击方法

 private async void button1_Click(object sender, EventArgs e)
    {


        Task<string> st1 = Task.Run(() => ReadFromFile());
        textBox1.AppendText("sdsadsa");
        textBox1.Text = st1.Result;



    }
private async void按钮1\u单击(对象发送方,事件参数e)
{
Task st1=Task.Run(()=>ReadFromFile());
文本框1.附录文本(“sdsadsa”);
textBox1.Text=st1.Result;
}
我想用ReadFromFile()从文本文件中读取

注意:ReadFromFile标记为async,因为我想在此方法中使用async和Wait

计划一些任务方法

但在我的button1\u click方法的第2行中调用append text方法后,我的Ui冻结了

然后等待结果并在文本框中显示

我想在任务中抛出ReadFromFile方法并等待它而不冻结ui

我尝试了很多方法,比如用这个替换1号线

Task<string> st1 = await Task.Factory.StartNew(() => ReadFromFile());
Task st1=wait Task.Factory.StartNew(()=>ReadFromFile());

有了这个,ui不会冻结,但它跳过了第2行append方法,我不知道为什么要跳过它?

只是
wait
ReadFromFile:

private async void button1_Click(object sender, EventArgs e)
{
    string st1 = await ReadFromFile();
    textBox1.AppendText("sdsadsa");
    textBox1.AppendText(st1);
}

如果您使用的是
async..wait
,则不应使用
.Result(即
st1.结果
textBox1.Text=wait st1
“…ReadFromFile标记为async,因为我想在此方法中使用async并等待…”-如果
ReadFromFile
中的代码已经在使用
async
i/O方法,则不应在
任务中包装调用。运行
。后者用于CPU限制的操作,而不是I/O。这是在浪费线程。谢谢Dmitry Bychenko,它正在工作,但我有一个问题,我应该什么时候使用结果方法???噢,MickyD,我理解你,但是当我在ReadFromFile方法中使用方法调用程序或for循环时,没有Task.run,用户界面将freeze@MickyD使用异步委托作为参数调用
Task.Run
,不会浪费线程<代码>任务.Run(async()=>…
当然不适用于CPU限制的操作。在OP的情况下,线程将被浪费(阻塞)只有当
ReadFromFile
不是一个
Task
返回方法时,ui才会冻结。是的,我知道这一点,但是如果我在ReadFromFile中添加任何方法调用程序,或者使用for或while循环,ui就会冻结。@MohamedSaleh如果使用
Result
,它就不会冻结。你最好忘记这个属性,尤其是现在还不是很有经验的属性使用异步编程。会给您带来很多问题。只需到处使用
wait