c# -异步返回结果

本文关键字:结果 返回 异步 | 更新日期: 2023-09-27 18:17:19

我知道我以前问过这个问题-但它涉及线程或任务。现在,我想在不使用线程或任务的情况下实现相同的目标,因为我的能力有限(代码是一个Lua脚本)。现在,我想要实现的是:

想象一个有两个按钮的表单。第一个按钮叫"运行",第二个按钮叫"设置"。我想运行显示一个MessageBox与文本:"The result was " + result。但是,我希望它只在结果设置后显示此MessageBox。因此,您单击Run按钮,它停止方法的执行(线程不会卡住,虽然,所以它是异步的),然后当您单击Set按钮时,它将响应设置为true,运行按钮的代码继续并显示MessageBox

如何在不使用线程和任务的情况下实现这一点?请举例说明。此外,如果可以的话,请展示线程或任务的示例,即使我的Lua代码限制了它。到目前为止,我已经尝试使用布尔值的TaskCompletionSource,但这涉及到等待操作符的使用,我不能使用,因为它是c#语法的一部分(Lua中不允许)。

问好。

c# -异步返回结果

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