111,090
社区成员




我在 winform窗体 拖入一个 serialPort1 控件
在serialPort1 的事件 serialPort1_DataReceived 想要实现 收到数据后 在 textbox中 显示出来
textBox1.Text = serialPort1.ReadExisting();
报错 说 夸线程错误
请老师指导一下 (// System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 不想用)
我专门学了 delegete 以及 action func
针对 串口接收 对不住 逻辑。 请老师指点,最好请用 action 或 func 。
textBox1.Invoke(new action(delegate { textBox1.text="内容"}));
private delegate void AppendTextSTRDelegate(string message);
public void AppendTextSTR(string ss)
{
if (rec.InvokeRequired)
{
AppendTextSTRDelegate d = AppendTextSTR;
rec.Invoke(d, ss);
}
else
{
rec.AppendText(ss);
}
}
在你接收到数据的地方调用 AppendTextSTRDelegate(string) 就OK,我的串口程序都是使用这么委托实现的.
这个年代,我们只会回复这个年代的解决方法(汽车都普及了,俺们就不会在去说啥怎么喂驴,赶马车的技术。)
这个年代,你可以这样做
Channel<int> channel = Channel.CreateUnbounded<int>();
...
ChannelReader<int> c = channel.Reader;
while (await c.WaitToReadAsync()) //都知道await会自动切换上下文的,所以你在一个正常写的代码里(非某些人天天告诉的你那些赶马车的‘秘籍’)
{
if (await c.ReadAsync(out int item))
{
// process item...
}
}
shengtou
ps:至于那些赶马车的有些落寞,我们说落寞就落寞把,当年有个片子叫神鞭,也许这些喜欢赶马车的应该看看。谁说剪掉辫子就不神了,把神留着就好