这是我想做的事情
// 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,并用它来绘制结果随着时间的推移。 所以我的问题是我只能初始化表单,但我不能随着时间的推移更新它。 任何提示将不胜感激。
答案 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;
}