构造函数中的C#字符串未传递给Form

时间:2014-10-18 22:35:52

标签: c# forms constructor pipe main

所以我编写了这个工具,通过另一个进程的命名管道接收字符串。我想将我从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

1 个答案:

答案 0 :(得分:0)

从多线程应用程序编辑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内部更改文本框。