我有2个脚本1- Soket.cs(Soket Server使用线程)FormMain.cs(Working Normal)我使用以下代码从soket.cs调用FormMain中的函数:
public void ResiveFunc(string FuncResive)
{
string FuncName = "";
string FuncValue = "";
for (int i = 0; i <= 2; i++)
{
FuncName += FuncResive[i];
}
for (int j = 4; j <= FuncResive.Length - 1; j++)
{
FuncValue += FuncResive[j];
}
MessageBox.Show(FuncName);
MessageBox.Show(FuncValue);
if (FuncName == "TAB")
{
Form1 mainForm = new Form1();
mainForm.AdverFilter(FuncValue);
}
FuncName = "";
FuncValue = "";
}
我在FormMain中调用这个AdverFilter()函数:
public void AdverFilter(string value)
{
Messagebox.show(value);
this.richTextBox1.Text = value;
}
但它不起作用! Messagebox显示该值很好但richtextbox为null ... 请告诉我如何解决这个问题......?
我将代码更改为以下内容:
public void AdverFilter(string value)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new Action<string>(AdverFilter),value);
}
else
{
MessageBox.Show(value);
this.richTextBox1.Text = value;
}
}
此代码没有语法错误,但仍然无效。我在此代码中添加了MessageBox.Show(richTextBox1.Text);
。它显示true
,但我的Richtextbox为null
。
答案 0 :(得分:0)
编辑:好的,这个额外的代码清除了一些东西。
回调很可能是通过ThreadPool完成的,因此线程的公寓状态是MTA。这是一个问题,因为您在回调的线程中创建表单,并且表单要求公寓状态必须是STA。也许您应该在主线程中创建表单,然后使用FredrikMörk所示的ISynchronizeInvoke接口。
PS。您应该使用System.String.Substring(...)来获取FuncName
和FuncValue
:
string FuncName = FuncResive.Substring(0, 3);
string FuncValue = FuncResive.Substring(4);
为什么FuncName
和FuncValue
值最后设置为空字符串?没有理由这样做。