【问题标题】:Task.Run with async method errorsTask.Run 出现异步方法错误
【发布时间】:2019-10-08 10:19:06
【问题描述】:

我有这样的 button1_click 方法

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


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



    }

我想用 ReadFromFile() 从文本文件中读取数据

注意:ReadFromFile 被标记为 async 因为我想在这个方法中使用 async 和 await

计划一些任务方法

但是在我的 button1_click 方法的第 2 行中附加文本方法调用后,我的 UI 冻结了

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

我想在任务中抛出 ReadFromFile 方法并等待它而不冻结用户界面

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

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

这样,用户界面不会冻结,但它会跳过第 2 行的附加方法,我不知道为什么会这样跳过?

【问题讨论】:

  • 如果您使用的是async..await,则不应使用.Result;(即st1.Result); textBox1.Text = await st1;
  • "...ReadFromFile 被标记为 async 因为我想在此方法中使用 async 和 await..." - 如果您在 ReadFromFile 中有代码已经在使用async I/O 方法,那么您不应该将调用包装在Task.Run 中。后者用于 CPU-bound 操作而不是 I/O。你在浪费一个线程
  • 哦,谢谢 Dmitry Bychenko,它正在工作,但我有一个问题,我什么时候应该使用 Result 方法???
  • ohh MickyD 我了解你,但是当我在没有 Task.run 的情况下在 ReadFromFile 方法中使用方法调用者或 for 循环时,用户界面将冻结
  • @MickyD 以异步委托作为参数调用Task.Run 不会浪费线程。 Task.Run(async () =&gt;... 当然不适合 CPU 绑定操作。在 OP 的情况下,仅当 ReadFromFile 不是 Task-returning 方法时,线程才会被浪费(阻塞)。

标签: c# multithreading task


【解决方案1】:

只需awaitReadFromFile:

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

【讨论】:

  • 是的,我知道这一点,但如果我在 ReadFromFile 中添加任何方法调用者或使用 for 或 while 循环,用户界面将冻结。
  • @MohamedSaleh 如果您使用avoid blocking asynchronous code 使用Result,它不会冻结。你最好忘记这个属性,尤其是现在对异步编程还不是很有经验的人。会给你带来问题和更多的问题。随处使用await
猜你喜欢
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 2017-04-24
  • 2016-08-04
  • 2016-12-28
相关资源
最近更新 更多