C# - 异步返回结果

我之前已经问过这个问题了,但是涉及到了线程或任务。现在,我想实现同样的功能,但不使用线程或任务,因为我受到限制(代码是Lua脚本)。现在,我想要实现的是这样的:

想象一下一个有两个按钮的表单。第一个按钮叫做“运行”,第二个按钮叫做“设置”。我想要让“运行”显示一个带有文本“The result was + result”的MessageBox。然而,我希望它只在结果设置之后显示这个MessageBox。因此,你点击“运行”按钮,它会暂停方法的执行(线程不会被卡住,因此它是异步的),然后当你点击“设置”按钮时,它将响应设置为true,运行按钮的代码继续,它会显示MessageBox

如何在不使用线程和任务的情况下实现这一点?请给出一些例子。此外,如果你可以的话,即使我的Lua代码有限制,也请展示一些线程或任务的例子。到目前为止,我已经尝试使用一个布尔类型的TaskCompletionSource,但这涉及到await操作符的使用,而我无法使用它,因为它是C#语法的一部分(在Lua中不允许)。

最好的问候。

点赞
用户3231537
用户3231537

一种非常原始的方法是在循环中使用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();
            }
        }
    }
}
2014-08-10 11:45:45