【发布时间】: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中有代码已经在使用asyncI/O 方法,那么您不应该将调用包装在Task.Run中。后者用于 CPU-bound 操作而不是 I/O。你在浪费一个线程 -
哦,谢谢 Dmitry Bychenko,它正在工作,但我有一个问题,我什么时候应该使用 Result 方法???
-
ohh MickyD 我了解你,但是当我在没有 Task.run 的情况下在 ReadFromFile 方法中使用方法调用者或 for 循环时,用户界面将冻结
-
@MickyD 以异步委托作为参数调用
Task.Run不会浪费线程。Task.Run(async () =>...当然不适合 CPU 绑定操作。在 OP 的情况下,仅当ReadFromFile不是Task-returning 方法时,线程才会被浪费(阻塞)。
标签: c# multithreading task