这应该非常简单,但我很难看到任何结果。
我有以下表单代码:
//Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NotepadRW
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected TextBox textReadInfo;
public void SetReadInfo(String str)
{
txtReadInfo.Text = str;
}
}
}
我还有以下程序代码:
//Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NotepadRW
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 form1 = new Form1();
Application.Run(form1);
form1.SetReadInfo("Hi");
}
}
}
结果如下:
为什么不显示我提供的字符串?我不能正确理解程序如何使用Windows窗体?当调用Form1的新实例时,Program.cs的Main()方法的执行是否会停止?
注意:我已尝试使用文本框和富文本框。相同的结果。
额外点数: 我是否正确地进行了封装?我打算将文本框修改为可公开访问(这将起作用),但我认为这将是&#34;正确的&#34;这样做的方法。
答案 0 :(得分:4)
虽然从the documentation开始并不明显,Application.Run(Form)
方法会阻止。您可以从以下引用中推断出这一点:
在返回此方法之前,将调用Form类的Dispose方法。
这意味着表单将完成它的工作,并且必须在Run
返回之前完成它。即,它阻止。
您可以通过切换订单来完成您想要的任务。而不是
Form1 form1 = new Form1();
Application.Run(form1);
form1.SetReadInfo("Hi");
试
Form1 form1 = new Form1();
form1.SetReadInfo("Hi");
Application.Run(form1);
答案 1 :(得分:1)
您不应该公开您的文本框,否则您可能会遇到跨线程执行异常。
您的代码无法正常工作的原因是您在主线程上运行表单,因此Application.Run()之后的任何内容都不会被执行。您可以在单独的线程上运行表单。
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 form = new Form1();
System.Threading.Thread workerThread = new System.Threading.Thread(() => Application.Run(form));
workerThread.Start();
form.SetReadInfo("Hello");