所以我编写了这个工具,通过另一个进程的命名管道接收字符串。我想将我从main方法收到的字符串传递给我的一个表单,但每当我使用字符串构造函数尝试它时,似乎值都是空的。
我有一种感觉,我对构造函数做错了,或者没有从我当前运行的表单中收到字符串...
这是我在主类中捕获和发送字符串的方法:
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时,该工具将不再启动
这感觉非常简单,但我现在已经挣扎了很长一段时间了,我非常感谢你们的帮助:)
提前致谢 Ravand
答案 0 :(得分:0)
从多线程应用程序编辑UI时,您可能需要使用Invoke
。你只能从它开始的线程
举个例子:
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内部更改文本框。