【问题标题】:C# - Return result asynchronouslyC# - 异步返回结果
【发布时间】:2014-10-02 18:57:18
【问题描述】:

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

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

如何在不使用线程和任务的情况下实现这一目标?请展示一些例子。此外,如果可以的话 - 即使我的 Lua 代码限制了它,也可以展示带有线程或任务的示例。到目前为止,我已经尝试使用布尔值的 TaskCompletionSource,但这涉及到 await 运算符的使用,我不能使用它,因为它是 C# sytnax 的一部分(在 Lua 中不允许)。

最好的问候。

【问题讨论】:

  • 如果不使用后台线程或async 方法,您无法实现多次单击按钮,您的用户界面将冻结并且不允许您单击第二个按钮
  • @YuvalItzchakov 但是如果我使用异步方法,我将不得不使用 await 运算符,而我不能,因为你不能在 Lua 上使用它。

标签: c# multithreading asynchronous lua


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2014-07-20
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多