【发布时间】:2020-01-29 20:05:04
【问题描述】:
通过单击一个按钮,我需要异步调用一个函数 f1() 来启动一个长操作。 当 f1() 运行时,我想用另一个按钮启动另一个函数 f2()。 当函数 f1() 完成后,我想认识到这一点。
我将整个事情分解为一个非常简单的示例,其中一个按钮启动一个长函数 writeStars(),该函数每 200 毫秒将“*”写入一个字符串,总共 20 次。 使用另一个按钮,我可以将“-”异步写入同一字符串。
private async void btnStartThread1_Click(object sender, EventArgs e)
{
Thread thread1 = new Thread(writeStars);
thread1.Start();
}
private void btnWriteMinus_Click(object sender, EventArgs e)
{
_Str += "-";
}
async void writeStars()
{
int count = 20;
do
{
_Str += "*";
Thread.Sleep(200);
} while (count-- > 0);
}
上面的代码给了我这样的结果:'**-****-*****-****'。
或者当更快地点击第二个按钮时:'**--*-**************'。
这真的是异步的 :-)
我想使用异步任务,以便能够在 writeStars() 结束时等待,然后也许启用一个按钮。我试过了,但我没有办法用 Task、async 和 await 编写这个简单的示例......
【问题讨论】:
-
将
writeStars的签名改为async Task writeStars()。然后,您可以执行以下操作:await Task.Run(() => writeStars()); DoSomethingAfterCompletion();。如需参考,请参阅:when to return a Task vs void。
标签: c# asynchronous async-await task