在Application.Run()之后更新表单

时间:2014-01-28 15:52:39

标签: c# winforms

这是我想做的事情

// pseudo code
Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 
Form1 myForm = new Form1();
Application.Run(myForm); 
while(true)
{
    string a = readline();
}
form1.show(a)

换句话说,我需要表单始终显示输入。但上面的代码将在“Application.Run(myForm);'”之后停止。我不在form1类中编写这样的代码的原因是代码的主要部分是在用F#编写的机器学习引擎上运行,并且因为F#没有一个好的可视化设计器。所以我试图创建一个简单的form1.dll,并用它来绘制结果随着时间的推移。 所以我的问题是我只能初始化表单,但我不能随着时间的推移更新它。 任何提示将不胜感激。

1 个答案:

答案 0 :(得分:2)

您尝试同时执行两项操作,因此您的应用程序应通过使用2个线程来反映这一点。接下来,Form的Show()方法不接受字符串,因此您需要实现自己的方法。

这是一个C#2.0 WinForms解决方案。程序运行线程并处理控制台输入:

static class Program
{
    [STAThread]
    private static void Main()
    {
        // Run form in separate thread
        var runner = new FormRunner();
        var thread = new Thread(runner.Start) {IsBackground = false};
        thread.Start();

        // Process console input
        while (true)
        {
            string a = Console.ReadLine();
            runner.Display(a);
            if (a.Equals("exit")) break;
        }
        runner.Stop();
    }
}

FormRunner负责线程调用:

internal class FormRunner
{
    internal Form1 form = new Form1();

    internal void Start()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(form);
    }

    private delegate void StopDelegate();

    public void Stop()
    {
        if (form.InvokeRequired)
        {
            form.Invoke(new StopDelegate(Stop));
            return;
        }
        form.Close();
    }

    private delegate void DisplayDelegate(string s);

    public void Display(string s)
    {
        if (form.InvokeRequired)
        {
            form.Invoke(new DisplayDelegate(form.Display), new[] {s});
        }
    }
}

Form1只需显示一些东西:

    public void Display(string s)
    {
        textBox1.Multiline = true;
        textBox1.Text += s;
        textBox1.Text += Environment.NewLine;
    }