我知道我之前问过这个问题 - 但它涉及线程或任务。现在,我希望在不使用线程或任务的情况下实现相同的功能,因为我受限(代码是Lua脚本)。现在,我想要实现的是:
想象一下带有2个按钮的表单。第一个按钮称为“运行”,第二个按钮称为“设置”。我希望“运行”显示带有MessageBox
文字的"The result was " + result
。但是,我希望它只在设置结果后显示此MessageBox
。因此,单击“运行”按钮,它会暂停方法的优先级(线程不会卡住,因此它是异步的),然后当您单击“设置”按钮时,它将响应设置为true,并将代码设置为继续运行按钮,它会显示MessageBox
。
如何在不使用线程和任务的情况下实现这一目标?请展示一些例子。此外,如果你能 - 显示线程或任务的例子,即使我的Lua代码限制它。到目前为止,我已尝试使用布尔值的TaskCompletionSource,但这涉及使用await运算符,我无法使用它,因为它是C#sytnax的一部分(Lua中不允许)。
最好的问候。
答案 0 :(得分:0)
一种非常原始的方法是在循环中使用Application.DoEvents(),它会以非常延迟的方式继续为您的表单提供服务,但它适用于您指定的内容。当然,如果你依赖于运行循环中更复杂的计算,你需要在复杂计算中调用application.doevents
所以,就像这样:
using System;
using System.Windows.Forms;
namespace TestForm
{
public partial class Form1 : Form
{
FakeAsync test = new FakeAsync();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
test.Start();
}
private void button2_Click(object sender, EventArgs e)
{
test.IsSet = true;
}
}
public class FakeAsync
{
public bool Running { get; protected set; }
public bool IsSet { get; set; }
protected virtual void Loop()
{
Running = true;
while (!IsSet)
{
Application.DoEvents();
}
MessageBox.Show("Hello World!");
Running = false;
}
public void Start()
{
if (!Running)
{
Loop();
}
}
}
}