c#MonoDevelop - 在单独的线程中修改标签

时间:2014-05-15 16:15:38

标签: c# multithreading label monodevelop

我在Linux上使用MonoDevelop并使用c#进行开发。 我有这个问题:

我会从serialPort读取字符串。我看到MonoDevelop没有启动SerialEventHandler,所以我找到了这个解决方案: 实现一个独立的线程,它始终运行。 这是代码:

private static string locateQuad="";
private static void threadRead ()
{
    string indata="";
    while (true) {
        if(isOpenSerial==true){
            try{
            indata=sp.ReadLine();
            Console.WriteLine ("dati ricevuti "+indata);
            locateQuad=indata;
            }
            } catch (Exception e){
                Console.WriteLine("IOException");
            }
        }
    }
}
Thread th = new Thread(new ThreadStart(threadRead));

现在我会使用值indatalocateQuad修改我的Label,但我无法调用this.label.text,因为我无法在this内使用{{1}}一个声明为static的方法,我也不能声明线程非静态调用的方法。

这是一只吃掉自己尾巴的狗!!!!!!!

所以,我希望你有一个解决方案。 感谢

1 个答案:

答案 0 :(得分:0)

这是因为.Net是线程安全的。您无法使用其他线程对线程执行操作。因此,您必须使用Delegates,Invokes和其他方法。

1。使用简单的Invoke方法。

您可以使用Invoke语句修改分离线程上的控件。这看起来像这样:

Invoke(new Action(() => {this.label1.Text = "Text modified using Invoke.";}));

这种方法是我喜欢的方法,因为它非常快速和简单。 您可以根据需要将内容替换为{ },即可以更改ForeColor,在表单中添加组件以及许多其他内容。在您的情况下,您可以将值分配给另一个线程变量。 :)

2。使用委托方法

委托方法更复杂,我不喜欢使用它们。但是,你可以使用它们。有一个关于代表的好教程:http://www.dotnetperls.com/delegate。我不会在这里复制/粘贴代码,所以请花点时间看看代表;)