c# 线程等待

indulge_calm 2018-04-17 05:36:31
我有一个线程是给串口发送指令的,还有一个port_dataReceived事件,怎么做到我的串口发送函数等待串口接受事件处理完毕再发送下一条指令
目前我用了autoResetEvent.WaitOne(); 和autoResetEvent.set();

不知这种方法是否实用 另外就是想串口发送函数等待一定时间以后也可以继续执行,这样的话应该怎么做
...全文
1328 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
indulge_calm 2018-04-24
  • 打赏
  • 举报
回复
引用 19 楼 sp1234 的回复:
能够把“一件事”一分为二,后半部分注册给委托回调,这是一个起码的编程设计素质。连 js 程序员都会回调编程,c# 有什么不会、不理解委托回调的呢? 只会写一个死循环然后进行阻塞,纠结什么“线程、监控”这类名词儿,其实是没有学好 c# 以及通用的编程模式的。 事件驱动设计是你进行任何交互程序设计的根本技术之一。有的人搞了10年编程确实还不知道事件驱动设计开发,这就是非常遗憾的了。
把后半部分注册给委托回调,也就是把数据处理那块交给委托回调? 这样的话后半部分执行完以后怎么再去执行前半部分呢
黎大 2018-04-23
  • 打赏
  • 举报
回复
我用了task+cancellationToken 不过要.net4以上。
Eason0807 2018-04-23
  • 打赏
  • 举报
回复
没人教,全靠自己摸索,理解委托回调确实很难
  • 打赏
  • 举报
回复
能够把“一件事”一分为二,后半部分注册给委托回调,这是一个起码的编程设计素质。连 js 程序员都会回调编程,c# 有什么不会、不理解委托回调的呢? 只会写一个死循环然后进行阻塞,纠结什么“线程、监控”这类名词儿,其实是没有学好 c# 以及通用的编程模式的。 事件驱动设计是你进行任何交互程序设计的根本技术之一。有的人搞了10年编程确实还不知道事件驱动设计开发,这就是非常遗憾的了。
休闲中 2018-04-21
  • 打赏
  • 举报
回复
数据接受需要做到自动接收,只要有数据返回,就能够马上接收到,是触发式的 发送跟接收完全是可以分开的,发送的管发送, 串口好像是双向的
cheng2005 2018-04-20
  • 打赏
  • 举报
回复
任何“通讯”里面都有一个通用的概念,那就是“超时” 你打电话问我一个事情,我之后一直没回复你,你怎么办? 你去自动售货机上买饮料,付款之后饮料一直不出来,你怎么办? 难道碰到类似的问题你就死等吗?
indulge_calm 2018-04-19
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:
修改一下上面的例子,假设首先我们得到一个 StringBuilder,然后“等待文本框上输入Enter键”,之后取出文本框内容继续处理数据,可以这样写
void start()
{
    var a = new StringBuilder(DateTime.Now.ToString());
    KeyEventHandler proc = null;
    proc = (s, arg) =>
    {
        if (arg.KeyCode == Keys.Enter)
        {
            this.textBox1.KeyDown -= proc;
            a.Append(this.textBox1.Text);
            test(a.ToString());
        }
    };
    this.textBox1.KeyDown += proc;
}

void test(string x)
{
    //.......
}
大脑中,对于异步的事情,要学会一分为二。你将任务委托注册给人家,然后当事件发生时,自然就调用起委托而继续处理了。不需要你浪费巨大资源、死缠烂打地在那里纠结什么线程、死循环、WaitOne、信号量之类的。
我现在写的是在发送指令以后waitOne 数据处理完以后set 然后就可以接着发送下一条指令 (或者是楼上上所说的处理完数据后调用发送指令的函数) 感觉这样总会遇到一个问题 如果我发送完指令 串口坏了 一直没有数据过来 我的程序不就死掉了吗。。。这个问题应该怎么解决比较好
indulge_calm 2018-04-19
  • 打赏
  • 举报
回复
引用 13 楼 sp1234 的回复:
嗯,要想搞专业一点的编程,肯定要费一些脑筋。不会是只用跟刚学编程时学的一样的那些思路就能搞开发的,肯定要在不同阶段学习好不同层面的设计模式。
老哥,我怎么感觉你好像没完全理解我的意思 我现在是有一个write_order函数发送指令,dataReceived事件用来处理数据,等数据处理完才会发送下一条指令,而且在串口不坏的情况下是一值循环运行的(发指令->处理数据->发指令_->处理数据->...........)。 我大概了解了一下委托,按照你说的那个,我注册一个委托给dataReceived事件,那write_order这个函数是不是也要添加到委托里以类似于轮播委托的方式运行(delegate += write_order,delegate+=dataReceived)这样的话,我怎么实现一个持续发送、处理的效果(类似于循环在执行)
indulge_calm 2018-04-19
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
不需要 WaitOne,你注册委托给 DataReceiced 事件,人家自然会回调你的委托。 不懂委托,只知道轮询,怎么搞交互式编程开发啊?!只能做一些简单的数学计算小函数哦。
老哥 我看了一下委托,委托的使用好像就是实现了可以把函数当作参数去传递,但是你上面说的这些还是不是很明白怎么去做
indulge_calm 2018-04-19
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
不需要 WaitOne,你注册委托给 DataReceiced 事件,人家自然会回调你的委托。 不懂委托,只知道轮询,怎么搞交互式编程开发啊?!只能做一些简单的数学计算小函数哦。
老哥,你说的这个不是很懂啊 能不能给段代码看一下 我看了一下委托的一些相关说明 可以把两个方法绑定到同一个委托上,调用方法的时候会依次调用绑定的方法,这个事件还是不太明白 难道要我把dataReceived这个事件跟发指令的函数绑定到同一个委托变量上?
  • 打赏
  • 举报
回复
嗯,要想搞专业一点的编程,肯定要费一些脑筋。不会是只用跟刚学编程时学的一样的那些思路就能搞开发的,肯定要在不同阶段学习好不同层面的设计模式。
indulge_calm 2018-04-19
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
不需要 WaitOne,你注册委托给 DataReceiced 事件,人家自然会回调你的委托。 不懂委托,只知道轮询,怎么搞交互式编程开发啊?!只能做一些简单的数学计算小函数哦。
额 这个委托看起来有点复杂
  • 打赏
  • 举报
回复
不需要 WaitOne,你注册委托给 DataReceiced 事件,人家自然会回调你的委托。 不懂委托,只知道轮询,怎么搞交互式编程开发啊?!只能做一些简单的数学计算小函数哦。
  • 打赏
  • 举报
回复
引用 4 楼 mohantuo1321 的回复:
但是我又该怎么判断这个函数是否被触发以判断是否来过数据
这是很典型的误区,这个说法其实非常荒唐,如果这个搞不清楚那么就根本不懂事件驱动了。 “你不需要去轮询什么东西,人家自然会来找你”。所以你要做的就是把一个委托注册给事件。
  • 打赏
  • 举报
回复
修改一下上面的例子,假设首先我们得到一个 StringBuilder,然后“等待文本框上输入Enter键”,之后取出文本框内容继续处理数据,可以这样写
void start()
{
    var a = new StringBuilder(DateTime.Now.ToString());
    KeyEventHandler proc = null;
    proc = (s, arg) =>
    {
        if (arg.KeyCode == Keys.Enter)
        {
            this.textBox1.KeyDown -= proc;
            a.Append(this.textBox1.Text);
            test(a.ToString());
        }
    };
    this.textBox1.KeyDown += proc;
}

void test(string x)
{
    //.......
}
大脑中,对于异步的事情,要学会一分为二。你将任务委托注册给人家,然后当事件发生时,自然就调用起委托而继续处理了。不需要你浪费巨大资源、死缠烂打地在那里纠结什么线程、死循环、WaitOne、信号量之类的。
  • 打赏
  • 举报
回复
看来你还不会使用事件。 我给你写一个例子,假设我们先给 Text 输入几个字符,然后监听 Text 的 Enter 事件,然后(当Enter按下之后)继续运行处理,这样写代码
KeyEventHandler proc = null;
proc = (s, arg) =>
{
    if (arg.KeyCode == Keys.Enter)
    {
        this.textBox1.KeyDown -= proc;
        MessageBox.Show("您输入了:" + textBox1.Text);
    }
};
this.textBox1.KeyDown += proc;
this.textBox1.Text = "abc";
这是一个很基本的捕获事件并且“继续执行”的编程模式。首先是产生委托,然后注册事件处理方法,在事件回调时首先取消事件监听,然后就可以“再处理下一个功能”了!
indulge_calm 2018-04-18
  • 打赏
  • 举报
回复
引用 3 楼 yuhijk2055 的回复:
一般的设备都会有查询,就是你串口发送一条查询数据,设备会反馈给你数据,你根据是否接收到数据判断设备是否在线,是否收到数据
设备接收数据我用的是串口接收事件 serialPort_DataReceived函数 如果有数据来的话会触发这个事件,如果没有数据来就不会出发这个事件 但是我又该怎么判断这个函数是否被触发以判断是否来过数据
Antony_WU_SZ 2018-04-18
  • 打赏
  • 举报
回复
使用异步处理,用await
indulge_calm 2018-04-18
  • 打赏
  • 举报
回复
c#里的winform程序可以实现暂停功能吗
无情时尚 2018-04-17
  • 打赏
  • 举报
回复
一般的设备都会有查询,就是你串口发送一条查询数据,设备会反馈给你数据,你根据是否接收到数据判断设备是否在线,是否收到数据
加载更多回复(2)

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧