【发布时间】:2021-03-27 16:47:52
【问题描述】:
我正在尝试让控件执行以下操作:
第一次点击开始显示文本:每 30 毫秒一个字符。 在第二次单击时取消该过程并立即显示全文。
这是我通过 BeginInvoke() 传递给控件的方法:
DBX_Dialogue.running = true;
for (int i = 0; i < line.text.Length; i++)
{
Text += line.text[i];
Thread.Sleep(30);
if (DBX_Dialogue.cancel)
{
Text = line.text;
DBX_Dialogue.running = false;
break;
}
}
DBX_Dialogue.running = false;
在主窗口的 OnClick() 方法中,我这样做:
if (DBX_Dialogue.running)
{
DBX_Dialogue.cancel = true;
return;
}
else
{
DelWrite delWrite = WriteLine;
DBX_Dialogue.BeginInvoke(delWrite);
}
但是,DBX_Dialogue.cancel 从未设置为 true,所以我想我的方法实际上并没有异步运行 - 我做错了什么?
【问题讨论】:
-
天哪,非常感谢!我处理这个问题的方式可以吗,还是有更好的方法?我将我的方法标记为异步,然后使用这一行:await Task.Delay(30);
-
如果您在循环中等待 30 秒(在后台线程上,使用
Thread.Sleep、await Task.Delay或使用 WinForms 计时器,您仍然不会获得响应行为。看看您的代码。如果有人在您上次投票后立即设置DBX_Dialogue.cancel,则在您看到它之前将是 30 秒。考虑使投票时间更快(例如 250 毫秒)并循环 4x30 次以标记您的 30 秒,或创建更多复杂的机制(可能使用WaitHandle.WaitAny或Task.WaitAny)来表示取消。
标签: c# winforms asynchronous controls