gpt4 book ai didi

来自构造函数的 C# 字符串未传递给表单

转载 作者:太空宇宙 更新时间:2023-11-03 15:49:41 24 4
gpt4 key购买 nike

所以我编写了这个工具,它通过命名管道从另一个进程接收字符串。我想将从我的主要方法接收到的字符串传递给我的一个表单,但是每当我尝试使用字符串构造函数时,它的值似乎都是空的。

我有一种感觉,我对构造函数做错了什么,或者没有从我当前运行的表单中接收到字符串...

这是我在主类中捕获和发送字符串的方法:

public static async void startServer()
{

Task.Factory.StartNew(() =>
{

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("PipeToProgram"))
{
pipeStream.WaitForConnection();

using (StreamReader sr = new StreamReader(pipeStream))
{
string message;
while ((message = sr.ReadLine()) != null)
{
Form1 form = new Form1(message); //passing the string
}
startServer(); //restarts server after passing string
}
}
});
}

这是我在 Form1 中的构造函数:

public Form1(string str)
{
InitializeComponent();
MessageBox.Show(str); //message arrives
addToList(str);
}

这是我的 addToList 方法:

    public void addToList(string str)
{
MessageBox.Show(str); //arrives
textBox1.Text = str; //not arriving/showing in form
}

我的主要方法:

[STAThread]
static void Main(string[] args)
{
if (m.WaitOne(TimeSpan.Zero, true))
{
startServer();

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());


}
else
{
startClient("message");
}

}

Form1 的默认构造函数:

public Form1()
{
InitializeComponent();
comboBox1.SelectedIndex = 0;
comboBox2.SelectedIndex = 1;
Timer_start();
checkWindowTimer_start();
checkBox1.FlatAppearance.BorderSize = 0;
}

我做错了什么?是因为重新初始化组件吗?但是当我不提供 InitializeComponents 时,该工具将不再启动

这感觉很简单,但我现在为此苦苦挣扎了很长一段时间,非常感谢你们的帮助:)

提前致谢拉旺

最佳答案

从多线程应用程序编辑 UI 时,您可能需要使用 Invoke。您只能从启动它的线程编辑 UI

举个例子:

public partial class Form1 : Form
{
static Random rand = new Random();

public Form1()
{
InitializeComponent();

System.Threading.Tasks.Task.Factory.StartNew(changetextfromanotherthread);

}

void changetextfromanotherthread()
{
for (int x = 0; x < 100; x++)
{
Invoke((Action)(() => { textBox1.Text = "" + rand.Next(); }));
System.Threading.Thread.Sleep(250);
}

}
}

这将从另一个线程成功更改文本框 100 次。

如果我们删除调用,我们将在 x == 1 时得到无效操作异常。这表明您不能从另一个线程更改 UI。

但是你不会得到那个错误吧

第二次删除对 Sleep(250) 的调用。现在文本框被更改一次并且没有错误。 (我真的不知道为什么)这与您的问题相似。

无论如何,即使我的某些观点对于此上下文无效,请从 Invoke 中更改文本框。

关于来自构造函数的 C# 字符串未传递给表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26445251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com