我在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));
现在我会使用值indata
或locateQuad
修改我的Label,但我无法调用this.label.text,因为我无法在this
内使用{{1}}一个声明为static的方法,我也不能声明线程非静态调用的方法。
这是一只吃掉自己尾巴的狗!!!!!!!
所以,我希望你有一个解决方案。 感谢
答案 0 :(得分:0)
这是因为.Net是线程安全的。您无法使用其他线程对线程执行操作。因此,您必须使用Delegates,Invokes和其他方法。
您可以使用Invoke语句修改分离线程上的控件。这看起来像这样:
Invoke(new Action(() => {this.label1.Text = "Text modified using Invoke.";}));
这种方法是我喜欢的方法,因为它非常快速和简单。
您可以根据需要将内容替换为{ }
,即可以更改ForeColor,在表单中添加组件以及许多其他内容。在您的情况下,您可以将值分配给另一个线程变量。 :)
委托方法更复杂,我不喜欢使用它们。但是,你可以使用它们。有一个关于代表的好教程:http://www.dotnetperls.com/delegate。我不会在这里复制/粘贴代码,所以请花点时间看看代表;)