交叉线程问题...帮助我

时间:2011-01-21 09:33:10

标签: c#

我有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

1 个答案:

答案 0 :(得分:0)

编辑:好的,这个额外的代码清除了一些东西。

回调很可能是通过ThreadPool完成的,因此线程的公寓状态是MTA。这是一个问题,因为您在回调的线程中创建表单,并且表单要求公寓状态必须是STA。也许您应该在主线程中创建表单,然后使用FredrikMörk所示的ISynchronizeInvoke接口。

PS。您应该使用System.String.Substring(...)来获取FuncNameFuncValue

string FuncName = FuncResive.Substring(0, 3);
string FuncValue = FuncResive.Substring(4);

为什么FuncNameFuncValue值最后设置为空字符串?没有理由这样做。